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 уже невалидный...
Здравствуйте, <Аноним>, Вы писали:
А>А>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>>
Это типа так:
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;
}
как то не очень красиво...
Здравствуйте, <Аноним>, Вы писали:
А>Как после 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>>