mingw g ++ vector <T>:: вставить ошибку - PullRequest
0 голосов
/ 19 декабря 2010
vector<int> nums;
nums.push_back(0);
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);

vector<int>::iterator it = nums.begin();
it++;

cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
    cout << (*jt) << endl;
}
cout << endl;

nums.insert(it, 100500);
cout << ">> insert(it, 100500)" << endl << endl;

cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
    cout << (*jt) << endl;
}
cout << endl;

it++;
cout << ">> it++" << endl << endl;

cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
    cout << (*jt) << endl;
}
cout << endl;

nums.insert(it, 100800);
cout << ">> insert(it, 100800)" << endl << endl;

cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
    cout << (*jt) << endl;
}
cout << endl;

it++;
cout << ">> it++" << endl << endl;

cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
    cout << (*jt) << endl;
}
cout << endl;

возвращает

it points to 1
0
1
2
3

>> insert(it, 100500)

it points to 1
0
100500
1
2
3

>> it++

it points to 2
0
100500
1
2
3

>> insert(it, 100800)

it points to 100800
134352185
0
100500
1
2
3

>> it++

it points to 2
134352185
0
100500
1
2
3

Не могу ничего понять.помогите!

mingw g ++ 4.5.0 win32

Ответы [ 2 ]

6 голосов
/ 19 декабря 2010

Когда вы вставляете новый элемент в vector, любые итераторы для элементов после позиции вставки становятся недействительными, и если происходит перераспределение, все итераторы в контейнере становятся недействительными.Перераспределение происходит каждый раз, когда v.capacity() - v.size() меньше, чем количество элементов, которые вы пытаетесь вставить.

Когда итератор признан недействительным, это означает, что итератор больше не может использоваться.Это неверно.

Эта перегрузка insert возвращает новый итератор для вставленного элемента, поэтому вы можете заменить это:

nums.insert(it, 100500);

следующим:

it = nums.insert(it, 100500);

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

Обратите внимание, что документация SGI STL не является официальной документацией для стандартной библиотеки C ++ и есть некоторые тонкие различия, но обычно ониразличия не особенно важны;Следует отметить, что некоторые части SGI STL не включены в стандартную библиотеку C ++, а некоторые части стандартной библиотеки C ++ не являются частью SGI STL.

0 голосов
/ 03 января 2011

Это не ошибка. Вы не смогли правильно прочитать документацию std::vector, прежде чем сделать вывод, что в программном обеспечении произошла ошибка; на самом деле, вставка вектора делает недействительными все итераторы.

...