while (it1 != it2)
{
cout<<it1->get_name()<<endl;
name_record nr = *it1;
nr.setnew("_CHG");
bool res = idx1.replace(it1,nr);
cout << "result is: " << res << endl;
it1++;
}
Проблема с этим кодом заключается в том, что после замены элемента x
он автоматически переупорядочивается на его новую позицию, так что it1
, который продолжает указывать на x
, «перепрыгивает» через последовательность и может пропустить или вернуться к элементам.
Решение состоит в том, чтобы добавить уровень косвенности и собрать итераторы для всех элементов перед началом замен:
#include <vector>
#include <boost/iterator/counting_iterator.hpp>
void modifyContainer(name_record_set & ns)
{
cout << endl << "ModifyContainer" << endl << "-------------" << endl;
NameIndexType & idx1 = ns.get<NameIndex>();
std::vector<IteratorType> v(
boost::make_counting_iterator(idx1.begin()),
boost::make_counting_iterator(idx1.end()));
std::vector<IteratorType>::iterator it1=v.begin(),
it2=v.end();
while (it1 != it2)
{
cout<<(*it1)->get_name()<<endl;
name_record nr = **it1;
nr.setnew("_CHG");
bool res = idx1.replace(*it1,nr);
cout << "result is: " << res << endl;
it1++;
}
cout << "--------------" << endl << endl;
}
Если вы раньше не использовали его, бит make_counting_iterator
- это просто компактный способ заполнить вектор итераторами для всех элементов ns
.