Я сбив с толку этим упражнением.Последовательные контейнеры || C++ Primer Fifth Edition Упражнение 9.22
Упражнение 9.22: Предполагая, что iv является вектором ints, что не так в следующей программе? Как вы можете исправить проблемы?
vector<int>::iterator iter = iv.begin(),
mid = iv.begin() + iv.size()/2;
while(iter != mid)
if(*iter == some_val)
iv.insert(iter, 2 * some_val)
Первое, что я хотел бы сделать, это пойти и спросить, что цель этой программы была. Поскольку я не уверен, кто написал этот раздел книги и не хочет беспокоить авторов за что-то, вероятно, тривиальное, я начал угадывать.
Я предполагаю, что они хотят вставить двойное значение первого значения в вектор до тех пор, пока значение не окажется посередине. (поскольку они указывают на начало и никогда не перемещаются по вектору, чтобы искать фактическое значение (тогда снова они назвали его some_val, чтобы искать значение не в начале, это тривиальное исправление, но тогда нужно было бы проверить это значение фактически находится в первой половине контейнера))
так a) вектор будет расти следующим образом?
{1,2,3,4,5}
{(2),1,2,3,4,5}
{2,(2),1,2,3,4,5}
{2,2,(2),1,2,3,4,5}
Первая проблема в этом случае, вставка в вектор, скорее всего, мгновенно аннулирует итераторы. Вместо этого мы могли бы использовать список, но тогда мы не сможем использовать арифметику итератора для вычисления середины. Вычисление середины только один раз, как в примере, недостаточно, так как в списке, таком как.), Он будет указывать на 3 и продолжать указывать на 3, просто потому, что мы вызвали итератор в середине и инициализировали его элементом в середина не означает, что она все еще указывает на середину после всех этих вставок.
Так вот что я сделал:
vector<int>::iterator iter=iv.begin();
while(iter!=iv.begin()+iv.size()/2){ //calculating mid each time
if(*iter==some_val)
iv.insert(iter,2*some_val);
iter=iv.begin(); //revalidate iter
while(*iter!=some_val) //find the original first element
++iter;
}
Я вижу, как упражнение заставляет вас думать, о котором последовательный контейнер использовать и как итераторы себя в растущем контейнере, но путь представлен упражнение, все еще меня озадачивает. Я пропустил какой-то очевидный момент?
PS: Поскольку целая глава посвящена последовательному контейнеру, я не фокусировался на проблемах, возникающих с условием в цикле while (это похоже на то, что они забывали все, чему они учили всего несколько глав назад).
Я думаю, что весь смысл упражнения - это недействительность итераторов. И вы можете увидеть, что возвращает ['std :: vector :: insert'] (http://en.cppreference.com/w/cpp/container/vector/insert). –
Первое, что я заметил, это 'iv.instert'. Вероятно, это не проблема. – matsjoyce
Спасибо, Иоахим! – JWD