vector::insert
От: Аноним  
Дата: 29.08.06 21:17
Оценка:
std::vector<char> cont;
std::vector<char>::iterator it = cont.begin();
while ((it = std::search(it, cont.end(), from.begin(), from.end())) != cont.end())
{
    it = cont.erase(it, it + from.size());
    cont.insert(it, to.begin(), to.end());
}

Как после insert продолжить поиск с позиции после вставки? it уже невалидный...
Re: vector::insert
От: Roman Odaisky Украина  
Дата: 29.08.06 21:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>std::vector<char> cont;
А>std::vector<char>::iterator it = cont.begin();
А>while ((it = std::search(it, cont.end(), from.begin(), from.end())) != cont.end())
А>{
А>    it = cont.erase(it, it + from.size());
А>    cont.insert(it, to.begin(), to.end());
А>}
А>

А>Как после insert продолжить поиск с позиции после вставки? it уже невалидный...

По индексу? O(1).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
До последнего не верил в пирамиду Лебедева.
Re[2]: vector::insert
От: Аноним  
Дата: 30.08.06 07:27
Оценка:
Это типа так:
std::vector<char> cont;
std::vector<char>::iterator it = cont.begin();
while ((it = std::search(it, cont.end(), from.begin(), from.end())) != cont.end())
{
    it = cont.erase(it, it + from.size());
    size_t ind = it - cont.begin() + to.size();
    cont.insert(it, to.begin(), to.end());
    it = cont.begin() + ind;
}


как то не очень красиво...
Re: vector::insert
От: Кодт Россия  
Дата: 30.08.06 13:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как после insert продолжить поиск с позиции после вставки? it уже невалидный...


Можно алгоритм переписать, по мотивам remove/erase
template<class some_iterator, some_const_iterator>
some_iterator remove_series(
    some_iterator itBegin, itEnd, // откуда будем вырезать
    some_const_iterator jtBegin, jtEnd // что мы ищем и вырезаем
)
{
    using namespace std;
    int jLength = distance(jtBegin,jtEnd); // длина вырезаемого фрагмента (чтобы много раз не считать)
    
    // вот он, наш remove_if
    some_iterator itFrom = itBegin, itTo = itBegin, itFound;
    while(itFrom != itEnd)
    {
        // осталось перенести [itBegin..itTo) <== [itFrom..itEnd)
    
        // ищем
        itFound = search(itFrom,itEnd, jtBegin,jtEnd);
        
        // перемещаем то, что идёт до найденного...
        if(itFrom != itTo)
            itTo = copy(itFrom,itFound, itTo);
        else
            itTo = itFound; // нет смысла копировать самих в себя, правда?
        // или то же самое, в одну строку
        itTo = itFrom==itTo ? itFound : copy(itFrom,itFound,itTo);
        
        // и перепрыгиваем найденный фрагмент
        advance(itFrom, jLength);
    }
    return itTo; // возвращаем конец записанных данных
}


cont.erase(
    remove_series(
        cont.begin(),cont.end(),
        from.begin(),from.end()
    ),
    cont.end()
);
// сравните
cont.erase(
    remove(
        cont.begin(),cont.end(),
        value
    ),
    cont.end()
);
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.