Я написал этот небольшой код только для того, чтобы увидеть, как итератор на самом деле становится недействительным и не указывает на измененное местоположение вектора после того, как его емкость достигнута.
Здесь размер вектора и пропускная способность изначально равны 5 . После этого я вставил несколько других элементов в вектор и не повторно инициализировал свой итератор, чтобы он указывал на myvector.begin()
. Это приводит к нежелательному значению 49
в моем выводе после максимальный размер вектора: 1073741823
при повторной печати элементов вектора.
Мой вопрос: почему C++ не возвращает итератор точки к действительному myvector.begin()
после того, как все элементы скопированы в новое место?
Это также может привести к некоторому поведению, которое трудно отладить. Я знаю, что безопасным способом работы было бы всегда повторно инициализировать итератор непосредственно перед его использованием.
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
int main()
{
vector<int> myvector;
vector<int>::iterator it;
int myarray[]= {100,200,300,400};
myvector.insert(it,500);
it=myvector.begin();
myvector.insert(it,myarray,myarray+4);
it=myvector.begin();
for(;it!=myvector.end();++it)
cout <<*it<<endl;
cout <<"size of vector is :" << myvector.size() <<"\n";
cout <<"capacity of vector is : " << myvector.capacity()<<"\n";
cout <<"maximum size of vector is : " << myvector.max_size()<<"\n";
myvector.push_back(600);
for(;it!=myvector.end();++it)
cout <<*it<<endl;
}
Output of program :-
100
200
300
400
500
size of vector is :5
capacity of vector is : 5
maximum size of vector is : 1073741823
49
100
200
300
400
500
600