Tôi đã viết mã nhỏ này chỉ để xem cách một trình vòng lặp thực sự bị vô hiệu và không trỏ đến vị trí thay đổi của một vectơ sau khi đạt được dung lượng của nó.Tại sao không C++ xử lý các trình vòng lặp khi chèn được thực hiện trong một vectơ sau khi đạt được dung lượng?
Ở đây kích thước của vectơ và dung lượng là cả 5 ban đầu. Sau đó tôi chèn một vài phần tử khác vào vectơ và không khởi tạo lại trình lặp của tôi để trỏ đến myvector.begin()
. Điều này dẫn đến một giá trị rác của 49
trong đầu ra của tôi sau maximum size of vector is : 1073741823
khi in lại các phần tử của vectơ.
Câu hỏi của tôi là tại sao C++ không làm cho trình lặp điểm trở lại thành myvector.begin()
hợp lệ sau khi tất cả các phần tử được sao chép vào vị trí mới?
Điều này cũng có thể dẫn đến một số hành vi có thể khó gỡ lỗi. Tôi biết một cách an toàn để làm việc sẽ là luôn luôn reinitialize iterator chỉ trước khi sử dụng nó.
#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
[với 'std :: vector' bất kỳ thứ gì thay đổi kích thước làm mất hiệu lực các trình lặp trước đó] (http://stackoverflow.com/a/6438087/168175) – Flexo
@awoodland, anh ấy biết rằng, tôi nghĩ anh ấy hỏi * lý do * điều này đang xảy ra. –
Mỗi thùng chứa STL đều đảm bảo một số đảm bảo về tính hợp lệ của các trình lặp của nó. Nó trả tiền để hiểu khi vòng lặp không hợp lệ cho một vùng chứa đã cho. Bạn chắc chắn không muốn luôn luôn đặt lại thành một 'bắt đầu()' mới chỉ trong trường hợp '. Xem tại đây để biết thông tin về 'vectơ' - http://www.sgi.com/tech/stl/Vector.html –