Re[5]: STL-вский vector и снихронизация потоков
От: rus blood Россия  
Дата: 05.08.05 05:14
Оценка:
Здравствуйте, realbob, Вы писали:

R>
R>       vector<int> v;
R>       vector<int>::iterator I;
R>       for(i = 0; i < 10000; i++)
R>            v.push_back(1);
R>       for(I = v.begin(); I < v.end(); I++)
R>            //используем I.

R>       for(i = 0; i < 10000; i++)
R>            v.push_back(2); //Память перераспередлилась.

1. Тот I, который был в первом цикле, стал невалидным.

R>       for(I = v.begin(); I < v.end(); I++)
R>            //используем I. <<тут была бы ошибка. А это, согласитесь, мягко говоря не так.

2. Тут не будет ошибки. Ведь Вы же проинициализировали I заново, вызвав begin() в начале цикла!!!

R>


Что-то Вы похоже запутались в итераторах. Сначала пишете неверную конструкцию, и считаете, что она будет работать верно. Потом Вы пишете верный код и ждете ошибку...

Попробуйте для сравнения вот так —

       vector<int> v;
       vector<int>::iterator I;
       for(i = 0; i < 10000; i++)
            v.push_back(1);
       for(I = v.begin(); I < v.end(); I++)
            //используем I.

       I = v.begin(); // <- выставляем I в начало вектора перед повторным распределением...

       for(i = 0; i < 10000; i++)
            v.push_back(2); //Память перераспередлилась.

       for(; I < v.end(); I++) // <- начинаем цикл с текущего значения итератора...
            //используем I. <<тут была бы ошибка. А это, согласитесь, мягко говоря не так.


и Вас почуствуете, что такое невалидный итератор.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.