在編程題中,遇到輸入要求多行數據時,之前是採用二維數組保存數組,但是空間的開闢總是未知的,或多或少也不合適。數組的越界問題會導致程序的奔潰,而且數組的動態性不好。
vector內存的特點是可變大小的,尾部插入刪除元素的效率還是很高的。
順便一提,迭代器的失效問題:
在向容器添加元素後:
- 如果是vector或string,插入元素且存儲空間被重新分配,則指向容器的迭代器、指針和引用都會失效;如果存儲空間未重新分配,指向插入位置之前的迭代器、指針和引用仍有效,插入之後元素的迭代器、指針和引用將會失效。
- 對於deque,如果在首尾位置添加元素,迭代器會失效,但指向元素的引用和指針不會失效;在首尾位置之外插入,都會導致迭代器、指針和引用失效。
- 對於list和forward_list,指向容器的迭代器、指針和引用仍有效。
從容器中刪除一個元素後,被刪除元素的迭代器、指針和引用會失效,而對於其他元素:
- 對於list和forward_list,指向容器其他位置的迭代器、指針和引用仍有效。
- 對於deque,如果在首尾之外的任何位置刪除元素,其他元素的迭代器、指針和引用會失效。如果刪除deque的尾元素,尾後迭代器會失效,其他不受影響;如果刪除首元素,同樣也不受影響。
- 對於vector和string,刪除元素之後的迭代器總會失效;被刪元素之前的迭代器、引用和指針仍有效。
在使用時,遇到了這樣的問題:
vector< vector<int> > vecT;
int i;
for(i=0; i<T; i++)
{
cin>>n;
vecT.resize(n);
for(j=0; j<n; j++)
{
cin>>A;
vecT[i].push_back(A);
}
}
當對vector操作時,編譯器會報出錯誤,下標訪問出錯。
你可以這樣定義一個模板,
vector< vector<int> > vec(4); //在一些舊的編譯器上要注意> 和 > 之間的空格,容易理解爲>>操作符出錯
這也就關鍵,vec可以保存4個向量,向量的長度是可以改變的。vec[i]返回的是第i個向量。同理,vec[i][j]返回的是第i個向量中的第j個元素。
在使用前,需要多加幾個步驟,指定向量的大小,如下:
for(int i=0;i<3;i++)
vec[i].resize(3);
這樣,你就定義了一個3X3的數組了(另一個3在 申明時定義的)。而且你可以隨時改變它的大小。
int m;
cin>>m;
vector< vector<int> > vec(m);
for(int i=0; i<3; i++)
{
vec[i].resize(4);
}
vec[1][2] = 1;
當然,還可以使用下邊這種方法:
vector< vector<int> > vec2;
vector<int> vec1;
int i,j;
for(i=0;i<10;++i){
vec1.clear();
for(j=0;j<10;++j)
{
vec1.push_back(i*10+j);
}
vec2.push_back(vec1);
}
for(i=0;i<10;++i){
for(j=0;j<10;++j)
cout<<vec2[i][j]<<' ';
cout<<endl;
}