Ошибка несовместимости векторных итераторов для вектора, содержащего итераторы другого вектора

Со ссылкой на этот «>предыдущий вопрос SO, я исправил свою ошибку и изменил итераторы, чтобы они были одного и того же «векторного типа», т.е.

я заменил строку

auto startIter = table.begin();

с

auto startIter = tabTypeIterVector[0];

в цикле for в функции AccessTableIteratorsVector(). Однако в приведенном ниже коде я все еще получаю сообщение "Ошибка утверждения отладки, ошибка несовместимости векторных итераторов, когда эта строка попадает в цикл for

itloop !=-endIter

typedef vector<vector<string> tableDataType;
vector<tableDataType::Iterator> tabTypeIterVector;
tableDataType table;
FillRows(vector<string> vstr)
{
    table.push_back(vstr);
    if(some_condition_satisfied_for_this_row())
    {
        tableDataType::Iterator rowIT = table.end();
        tabTypeIterVector.push_back(rowIT);
    }
}


In another function:

AccessTableIteratorsVector()
{
auto startIter =  tabTypeIterVector[0];
auto endIter = tabTypeIterVector[1];
   for(auto itloop=startIter; itloop !=-endIter;itloop++)
   {

   }
}

person codeLover    schedule 23.07.2017    source источник
comment
Почему вы хотите хранить вектор итераторов? Какую настоящую проблему он должен решить?   -  person Some programmer dude    schedule 23.07.2017
comment
… и почему вы просто не сохраняете индексы, которые не становятся недействительными.   -  person spectras    schedule 23.07.2017


Ответы (1)


push_back может привести к перераспределению данных, содержащихся в векторе. И это перераспределение сделает все итераторы вектора недействительными. Разыменование недействительных итераторов приводит к неопределенному поведению.

Индексы в векторе останутся в силе, пока вы не удалите элементы из вектора.

person Some programmer dude    schedule 23.07.2017
comment
Можно ли получить индекс из действительного итератора вектора? - person codeLover; 23.07.2017
comment
Я был бы больше обеспокоен тем, что сохраняется вектор end(). - person juanchopanza; 23.07.2017