STL unique_copy + подсчет одинаковых элементом
От: Аноним  
Дата: 24.06.11 06:45
Оценка:
Доброго времени суток,
Подскажите возможно ли сделать с помощью STL следующее:

Исходные данные:
Массив содержащий последовательно одинаковые элементы. Пример: 11123244444
Требуется:
сформировать/отредактировать массив таким образом чтоб последовательные элементы не повторялись и было подсчитано кол-во элементов. Пример {1,3}{2,1}{3,1}{2,1}{4,5}

Собственно замечательно удаляет повторения, только как еще подсчитать кол-во повторений ?

заранее спасибо за ответы
Re: STL unique_copy + подсчет одинаковых элементом
От: Андрей Е  
Дата: 24.06.11 09:56
Оценка: -1
Пусть контейнер a содержит исходные числа, тогда решение может выглядеть так:
std::map<int, int> m;
for(iterator i = a.begin(); i != a.end(); ++i)
{
  ++m[*i];
}
Re[2]: STL unique_copy + подсчет одинаковых элементом
От: s.ts  
Дата: 24.06.11 19:24
Оценка: :)
Здравствуйте, Андрей Е, Вы писали:

АЕ>Пусть контейнер a содержит исходные числа, тогда решение может выглядеть так:

АЕ>
АЕ>std::map<int, int> m;
АЕ>for(iterator i = a.begin(); i != a.end(); ++i)
АЕ>{
АЕ>  ++m[*i];
АЕ>}
АЕ>


тут достаточно std::set — он умеет считать кол-во элементов std::set::count
Re[2]: Этот код делает не то!
От: Erop Россия  
Дата: 24.06.11 19:28
Оценка: 1 (1)
Здравствуйте, Андрей Е, Вы писали:

АЕ>
АЕ>std::map<int, int> m;
АЕ>for(iterator i = a.begin(); i != a.end(); ++i)
АЕ>{
АЕ>  ++m[*i];
АЕ>}
АЕ>


Обрати внимание, что у ТС последовтельность "11123244444", превратилась в "{1,3}{2,1}{3,1}{2,1}{4,5}", а у тебя будет не так!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: STL unique_copy + подсчет одинаковых элементом
От: Erop Россия  
Дата: 24.06.11 19:29
Оценка: :)
Здравствуйте, s.ts, Вы писали:

ST>тут достаточно std::set — он умеет считать кол-во элементов std::set::count


Интересно, о производительности тут хоть кто-то задумывается?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: STL unique_copy + подсчет одинаковых элементом
От: Erop Россия  
Дата: 25.06.11 00:12
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А> Массив содержащий последовательно одинаковые элементы. Пример: 11123244444

А>Требуется:
А> сформировать/отредактировать массив таким образом чтоб последовательные элементы не повторялись и было подсчитано кол-во элементов. Пример {1,3}{2,1}{3,1}{2,1}{4,5}

А>Собственно замечательно удаляет повторения, только как еще подсчитать кол-во повторений ?


Не совсем понятно, в чём проблема-то? Ты результат в виде чего хочешь иметь? В виде контейнера пар?

Ну, типа
template<typename TIter, typename TDst>
void toRLE( TIter begin, TIter end, TDst dst )
{
    typedef typename TDst::container_type  TContainer;
    typedef typename TContainer::value_type TRLEPair;
    
    
    if( begin == end ) {
        return;
    }
    size_t group_count = 1;    
    TIter group_begin = begin, group_end = begin;
    while( ++group_end != end ) {
        //  assert( group_end - group_begin == group_cout );
        if( *group_begin == *group_end ) {
            ++group_count;
            continue;
        }
        //  Непоследняя группа
        *dst++ = TRLEPair( *group_begin, group_count );
        group_count = 1;
        group_begin = group_end;
    }
    // Последняя группа
    //  assert( group_end - group_begin == group_cout );
    *dst++ = TRLEPair( *group_begin, group_count );
}


используем, как-то так:

int main()
{
    const short data[] = { 1, 1, 1, 1, 2, 3, 2, 4, 4, 4, 4, 4 };
    
    output_container( std::cout, data ) << std::endl;
  
    std::vector< std::pair<int, size_t> > rle;
    toRLE( const_begin_of( data ), const_end_of( data ), back_inserter( rle ) );

    output_container( std::cout, rle, "" ) << std::endl;
    
    return 0;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: STL unique_copy + подсчет одинаковых элементом
От: jazzer Россия Skype: enerjazzer
Дата: 25.06.11 02:27
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, s.ts, Вы писали:


ST>>тут достаточно std::set — он умеет считать кол-во элементов std::set::count


E>Интересно, о производительности тут хоть кто-то задумывается?


А-а-а, преждевременная оптимизация! Только после профайалера!
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: STL unique_copy + подсчет одинаковых элементом
От: Erop Россия  
Дата: 25.06.11 03:09
Оценка:
Здравствуйте, jazzer, Вы писали:

E>>Интересно, о производительности тут хоть кто-то задумывается?

J>А-а-а, преждевременная оптимизация! Только после профайалера!
Не, блин, но не настолько же? (это волосы от ужаса шевелятся!!!)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: STL unique_copy + подсчет одинаковых элементом
От: uzhas Ниоткуда  
Дата: 25.06.11 08:45
Оценка: :)))
Здравствуйте, Erop, Вы писали:

E>это волосы от ужаса шевелятся!!!

не упоминайте меня всуе!
Re: STL unique_copy + подсчет одинаковых элементом
От: Caracrist https://1pwd.org/
Дата: 26.06.11 01:12
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А> Доброго времени суток,

А>Подскажите возможно ли сделать с помощью STL следующее:

А>Исходные данные:

А> Массив содержащий последовательно одинаковые элементы. Пример: 11123244444
А>Требуется:
А> сформировать/отредактировать массив таким образом чтоб последовательные элементы не повторялись и было подсчитано кол-во элементов. Пример {1,3}{2,1}{3,1}{2,1}{4,5}

А>Собственно замечательно удаляет повторения, только как еще подсчитать кол-во повторений ?


А>заранее спасибо за ответы




template<typename T, typename Cmp = less<T> >
struct count_back_inserter
{
 typedef count_back_inserter<T, Cmp > this_t;
 typedef forward_iterator_tag iterator_category;
 typedef T value_type;
 typedef int difference_type;
 typedef T* pointer;
 typedef T& reference;

 typedef list<pair< T, int> > cont_t;
 cont_t *m_container;
 count_back_inserter(cont_t &container):m_container(&container){}
 this_t operator++(int){return *this;}
 this_t &operator++(){return *this;}
 this_t &operator*() {return *this;}
 this_t &operator=(const T&v) 
 {
   if (m_container->empty() ||
      Cmp()(m_container->back().first, v) ||  
      Cmp()(v, m_container->back().first) )
   {
     m_container->push_back(make_pair(v, 1));
   }
   else
   {
     m_container->back().second++;
   }
   return *this;
 }
};

// copy(vec.begin(), vec.end(), count_back_inserter<int>(lst));



http://codepad.org/QJtX5h99
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.