使用vector,要新增其標頭檔案#include。
1.vector的初始化及賦值,比如:
std::vectornvec; // 空物件
std::vectornvec(5,-1); // 建立了乙個包含5個元素且值為-1的vector
std::vectorstrvec; // 列表初始化
要注意「()」和「{}」這樣的初始化情況,比如:
std::vectornvec(10,1); // 包含10個元素,且值為1
std::vectornvec; // 包含2個元素,值分別為10,1
然而,一般在程式中,並不會知道vector的元素個數,故使用以上方式倒顯得繁瑣,所以可以使用push_back,它會負責將乙個值當成vector物件的尾元素「壓到(push)」vector物件的「尾端(back)」。比如:
std::vectornvec;
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::vectornvec;
for(int i = 0; i < 5; ++i)
nvec[i] = i; // error
這樣編寫**是錯誤的,nvec是空的,不包含任何物件。當然也就不可能通過下標來新增或訪問任何元素。若要新增請使用push_back。
當然,針對於輸出,可使用迭代器iterator來表示,比如上面的例子可寫成:
std::vector::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::vectornvec;
for(int i = 0; i < 5; ++i)
nvec.push_back(i);
std::vector::iterator iter = nvec.begin();
for(; iter != nvec.end(); ++iter)
正確的方式是(刪除特定元素):
std::vector::iterator iter = nvec.begin();
for(; iter != nvec.end();)
刪除容器內某乙個特定的元素,編寫方式可為:
std::vector::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()) // 判斷有效性
針對於std::find函式的使用,要包含標頭檔案:#include
刪除容器內所有元素,當然可以這樣:
nvec.erase(nvec.begin(),nvec.end());
不過,偶經常習慣於: nvec.clear();
4. vector的容量與大小:
vector並非隨著每個元素的插入而增長自己,它總是分配一些額外的記憶體容量,這種策略使得vector的效率更高些。若要獲取當前vector的大小,可呼叫size()函式,而獲取當前vector的容量,可呼叫capcity()。
注意,list不需要容量,是由於它的每次增長,只是簡單的鏈結新元素而已。
Vector容器與iterator迭代器
首先,回顧一下 的用法 是運算子中等級最高的,它分為三種 1 global scope 全域性作用域符 用法 name 2 class scope 類作用域符 用法 class name 3 namespace scope 命名空間 作用域符 用法 namespace name 他們都是左關聯 le...
容器vector和迭代器iterator 使用
容器vector宣告方式 vector 型別 變數名 引數 使用前需要引用 incude 初始化方式有下面幾種 1 宣告初始化例如 vectorvct 預設建構函式為空 vectorvct1 vct 用已宣告好容器來初始化 vectorvct2 3,5 大小為3的容器初始化三個都等於5 vector...
c 迭代器iterator 和 vector
初始化vector vectorv1 vectorv2 v1 vectorv3 n,i v3包含了n個值為i的元素 vectorv4 n v4含有初始化元素的n個副本 empty 判斷向量是否為空 begin 返回向量迭代器的首元素 end 返回向量迭代器末元素的下乙個元素 front 返回第乙個資...