C ++ "векторный итератор не разложим"? - PullRequest
0 голосов
/ 02 февраля 2012

Я пытаюсь решить эту проблему с UVa .

И я пытаюсь использовать Vector для решения этой проблемы.Мне нужно смоделировать что-то вроде кругового связанного списка, поэтому я использую итератор для доступа к элементам.Но после попытки я обнаружил, что у итератора Vector возникли проблемы с увеличением и уменьшением, и я не могу стереть элемент, используя в качестве аргумента reverse_iterator.Я сейчас в замешательстве.Что-то не так с моим кодом, потому что я пропустил некоторые важные детали, или я должен решить эту проблему по-другому ??

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

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

0 голосов
/ 02 февраля 2012

Что если m_pos равно people.rbegin()?Поэтому --m_pos не является допустимым итератором, и это может быть источником проблемы.

Также возможно, что вы удалили элемент, на который указывает --m_pos в строке перед:

k_pos = people.erase(k_pos);         // erase the element

Другая вещь, которую вы можете улучшить в своем коде, - это установка k_pos и m_pos итераторов более эффективным способом.Вместо:

for (int i = 1; i < k; i++)
{
    k_pos++;
    if (k_pos == people.end()) // if reach the end, go to begin
    k_pos = people.begin();
}

Вы можете написать:

#include <iterator>
std::advance(people.begin(), k % people.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...