vector與iterator的一些用法

2022-03-18 02:02:18 字數 2955 閱讀 1515

使用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 返回第乙個資...