Я потерян: Итератор вектора std :: string отлично работает, если нет вызова функции (Z_UB-> set()) перед ним ++. Вот код:C++ Iterator случайно недействителен
std::vector<std::string>::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);
it++;
std::cout << "second of vector: " << *it << std::endl;
создает следующий вывод
begin of vector: scn1
Однако, если я перееду вызов функции следующим образом:
std::vector<std::string>::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
it++;
std::cout << "second of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);
Результат следующий, что ожидаемый поведение:
begin of vector: scn1
second of vector: scn2
Внутри функции Z_UB-> набор() не осталось ничего, кроме самого вызова:
void Parameter::set(std::string _i, std::string _j, float value) {
//int i = indexSets[0]->backIndex(_i);
//int j = indexSets[1]->backIndex(_j);
//data2D[0][0] = value;
}
Так что, если я вызываю функцию набора Z_UB->() после того, как я создал итератора, доступ к ней приведет к краху программы , Есть ли что-то жизненно важное, что я пропустил об Итераторах?
Здесь не достаточно информации для диагностики вашей конкретной проблемы. Итераторы не становятся недействительными «случайным образом», поэтому проблема заключается в вашем коде, но неясно, из этого сообщения _where_ в вашем коде проблема. Действительно ли 'Z_UB' типа' Parameter'? Существуют ли какие-либо другие типы, которые могут быть, все, что изменяет базовый «вектор»? Итераторы 'vector' недействительны при изменении размера внутреннего хранилища' vector'. – Chad
Получает ли getVector() ссылку на вектор или копию? –
Он возвращает копию вектора (в терминах я не использовал & нигде) – buhmann