使用vector,要添加其頭文件#include<vector>。
1.vector的初始化及賦值,比如:
std::vector<int> nVec; // 空對象
std::vector<int> nVec(5,-1); // 創建了一個包含5個元素且值為-1的vector
std::vector<std::string> strVec{"a", "b", "c"}; // 列表初始化
要注意“()”和“{}”這樣的初始化情況,比如:
std::vector<int> nVec(10,1); // 包含10個元素,且值為1
std::vector<int> nVec{10,1}; // 包含2個元素,值分別為10,1
然而,一般在程序中,並不會知道vector的元素個數,故使用以上方式倒顯得繁瑣,所以可以使用push_back,它會負責將一個值當成vector對象的尾元素“壓到(push)”vector對象的“尾端(back)”。比如:
std::vector<int> nVec;
for(int i = 0; i < 5; ++i)
nVec.push_back(i); // 壓入元素
for(size_t i = 0; i < nVec.size(); ++i)
std::cout << nVec[i] << std::endl; // 輸出元素
其中size()是獲取vector元素的個數,另外vector中可使用empty()來返回vector中是否存在元素,如果為空,則返回true,否則返回false。同時,針對nVec[i]是通過下標運算符來獲取對應的vector數值的,千萬注意,針對於空的vector,萬不可通過下標運算符來添加元素,比如:
std::vector<int> nVec;
for(int i = 0; i < 5; ++i)
nVec[i] = i; // error
這樣編寫代碼是錯誤的,nVec是空的,不包含任何對象。當然也就不可能通過下標來添加或訪問任何元素。若要添加請使用push_back。
當然,針對於輸出,可使用迭代器iterator來表示,比如上面的例子可寫成:
std::vector<int>::iterator itr = nVec.begin();
for(; itr != nVec.end(); ++itr)
std::cout << (*itr) << std::endl;
針對於iterator有兩種標准庫類型: iterator 和 const_iterator。
兩者的區別主要是后者類似於常量指針,只能讀取不能修改。如果vector對象不是常量,兩者均可使用。
2.插入元素
deque像vector一樣提供了隨機訪問元素的能力,但deque支持push_front,且保證在容器首尾進行插入和刪除元素的操作只花常數時間。
使用insert可在容器的任意位置插入0個或多個元素,vector,deque,list和string都支持insert成員。一般insert函數將元素插入到迭代器所指定的位置之前,比如:
slist.insert(iter,"hello"); // 將Hello添加到iter之前的位置
要注意,將元素插入到vector,deque和string中的任何位置都是合法的,但是這樣做會很耗時。
c.insert(pos,num); // 在pos位置插入元素num
c.insert(pos,n,num); // 在pos位置插入n個元素num
c.insert(pos,beg,end); // 在pos位置插入區間為[beg,end)的元素
3.刪除元素
針對於非array容器有多種刪除方式,以erase為例,比如:
c.erase(p); // 刪除迭代器p所指定的元素,返回一個指向被刪除元素之后的迭代器。
c.erase(begin,end); // 刪除b,e所指定范圍內的元素,返回一個指向被刪除元素之后的迭代器。
c.clear(); // 刪除所有元素
注意,刪除元素,會導致迭代器無效。故下面的編寫方式是錯誤的,比如:
std::vector<int> nVec;
for(int i = 0; i < 5; ++i)
nVec.push_back(i);
std::vector<int>::iterator iter = nVec.begin();
for(; iter != nVec.end(); ++iter)
{
if(*iter == 1)
nVec.erase(iter);
}
正確的方式是(刪除特定元素):
std::vector<int>::iterator iter = nVec.begin();
for(; iter != nVec.end();)
{
if(*iter == 0)
iter = nVec.erase(iter);
else
iter++;
}
刪除容器內某一個特定的元素,編寫方式可為:
std::vector<int>::iterator iter = std::find(nVec.begin(),nVec.end(),5);
if(iter != nVec.end())
nVec.erase(iter);
刪除容器內某一段范圍內的元素,編寫方式可為:
first = std::find(nVec.begin(),nVec.end(), value1);
last = std::find(nVec.begin(),nVec.end(), value2);
if(first != nVec.end() && last != nVec.end()) // 判斷有效性
{
nVec.erase(first,last);
}
針對於std::find函數的使用,要包含頭文件:#include <algorithm>
刪除容器內所有元素,當然可以這樣:
nVec.erase(nVec.begin(),nVec.end());
不過,偶經常習慣於: nVec.clear();
4. vector的容量與大小:
vector並非隨着每個元素的插入而增長自己,它總是分配一些額外的內存容量,這種策略使得vector的效率更高些。若要獲取當前vector的大小,可調用size()函數,而獲取當前vector的容量,可調用capcity()。
注意,list不需要容量,是由於它的每次增長,只是簡單的鏈接新元素而已。