vector的日常使用

在編程題中,遇到輸入要求多行數據時,之前是採用二維數組保存數組,但是空間的開闢總是未知的,或多或少也不合適。數組的越界問題會導致程序的奔潰,而且數組的動態性不好。

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章