2014-01-17 2 views
1

Ну, в названии говорится все.Как получить недействительный итератор?

У меня есть этот кусок кода:

std::list<vector<Plane>> list; 
std::list<vector<Plane>>::iterator possible_planes_it; 

... 

for(possible_planes_it = list.begin(); possible_planes_it != 
    list.end(); possible_planes_it++) 
{ 
     if(static_cast<float>(good_matches.size()) >= static_cast<float>((matches.size())*0.8)) 
     { 
     if(possible_planes_it->back().getTimestamp() < count) // Means that there has not been a match found this round 
     { 
      possible_planes_it->push_back(Plane(area, *center_it, keypoint, descriptor, count)); 
      possible_planes_it->back().setNumberOfGoodMatches(good_matches.size()); 
     } 
     else 
     { 
      if(possible_planes_it->back().getNumberOfGoodMatches() < good_matches.size()) 
      { 
       possible_planes_it->pop_back(); // If a better match has been found, remove the last vector entry and push the new one 
       possible_planes_it->push_back(Plane(area, *center_it, keypoint, descriptor, count)); 
       possible_planes_it->back().setNumberOfGoodMatches(good_matches.size()); 
      } 
      else 
      { 
       list.push_back(vector<Plane>()); 
       list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count)); 
      } 
     } 
    } 
    else 
    { 
     list.push_back(vector<Plane>()); 
     list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count)); 
    } 
} 

Где-то в этом для цикла мои итераторы получить недействительным, так что он застрял в бесконечном цикле. Но как я могу сохранить мои итераторы?

+0

В названии не говорится все. Нам нужно знать, что это за контейнер. –

+0

Sry, обновил код. Его список векторов. – user2175762

+0

И какой итератор недействителен? Похоже, что итератор в списке? –

ответ

1

Вам просто нужно смотреть на cppreference.com или cplusplus.com, чтобы увидеть итераторы Действительность

В основном каждый раз, когда вы push_back данные внутри вектора есть шанс, что он получает перераспределены (если вы не защищены достаточно размера). Когда вектор перераспределяется, каждый итератор с его элементами аннулируется.

Итераторы для элементов списка остаются почти всегда валидными даже при вставке/стирании элементов (только итераторы для стираемых элементов становятся недействительными).

Бесконечный цикл может быть тот факт, что вы добавляете 1 элемент списка на каждой итерации

{ 
    list.push_back(vector<Plane>()); 
    list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count)); 
} 

Вы должны доказать, что этот код никогда не будет делать цикл бесконечно. Просто добавьте счетчик и распечатайте его значение, затем счетчик для подсчета числа циклов и распечатайте его тоже.

В принципе, если у вас есть итератор для элемента списка last-1, и вы добавляете элемент, то итератор элемента списка последнего-1 становится итератором элемента списка последних 2.

Таким образом, вы можете удалить элемент в начале и добавить элемент в конец, и ваша проверка для «конца» итератора будет похожа на собаку, кусающую ее хвост.

также:

Недействительные итераторы вызовет SEG-неисправность первой или более поздней версии. Возможно, ваша проблема не связана с итератора действия

Может быть, вы можете использовать

list.push_front 

?

UPDATE REMOVED

+0

Ваше обновление не имеет смысла, 'possible_planes_end' не является typedef, это переменная. Предположительно, ОП устанавливает его где-то в разделе «...». Также изменение этого параметра на 'possible_planes.end' не будет работать, потому что это не допустимое имя переменной. – SirGuy

+0

О, человек, ненавижу неполные фрагменты, кстати, он все еще может быть чем-то вроде макроса: D, если нет кода, показывающего, что это такое. – GameDeveloper

1

Ваши итераторы не становятся недействительными, так как для std::list

Addition, removal and moving the elements within the list 
    or across several lists does not invalidate the iterators. 
    An iterator is invalidated only when the corresponding 
    element is deleted. 

От here.
Поскольку вы не удаляете какие-либо элементы, ни один из ваших итераторов недействителен.

Что это происходит то, что ваш «possible_planes_end» итератор всегда указывает на конец списка (даже после добавления элементов), и поэтому ваша проблема может быть сведена к этой небольшой фрагмент кода:

#include <list> 

    int main() 
    { 
     std::list<float> l; 
     std::list<float>::iterator i = l.begin(), end = l.end(); 
     do 
     { 
      l.push_back(1); 
      i++; 
     }while(i != end); 
    } 

Это выполняется вечно, потому что, поскольку размер l продолжает увеличиваться на один цикл, i продолжает указывать на следующий элемент. Навсегда.

+0

И когда-либо ... и когда-либо ... и когда-либо ... –

+0

этот код закончится сначала или позже, потому что добавляет непрерывное значение (сначала или позже вы получите std :: bad_alloc), потому что вы не стираете элементы – GameDeveloper

+0

@ DarioOO Даже если ваша машина в конечном итоге исчерпала память, если это единственное условие остановки, я думаю, что многие люди все еще считают этот бесконечный цикл. Однако, да, это не будет продолжаться вечно. – SirGuy

Смежные вопросы