9 3 順序容器操作

2022-09-23 10:48:11 字數 4158 閱讀 8891

目錄9.3.2 訪問元素

9.3.3 刪除元素

9.3.4 特殊的forward_list操作:略

9.3.5 改變容器的大小

9.3.6 容器操作可能使迭代器失效

s.push_back('a'); //等價於 s+='a'

listilist;

for(int i = 0; i != 4; ++i)

ilist.push_front(i);

slist.insert(iter, "hello");:將「hello」新增到iter之前的位置

雖然某些容器不支援push_front 操作,但它們對於 insert 操作並無類似的限制(插入開始位置)。因此我們可以將元素插入到容器的開始位置,而不必擔心容器是否支援push_front:

vectorsvec;

listslist;

//等價於呼叫slist.push_front("hello")

slist.insert(slist.begin(), "hello");

//vector不支援push_front,但我們可以插入到begin()之前

//警告:在vector結尾之外的地方插入元素可能會很慢

svec.insert(svec.begin(), "hello");

//在svec結尾前新增10個元素,初始化為"anna"

svec.insert(svec.end(), 10, "anna");

//將svec的最後兩個元素新增到slist的開始位置

slist.insert(slist.begin(), svec.end()-2, svec.end());

slist.insert(slist.begin(), );

注意

傳遞給insert的迭代器不能指向新增元素的目標容器

insert返回第乙個新加入元素的迭代器

理解下述迴圈:等價於不斷呼叫push_back

listlst;

auto iter = lst.begin();

while(cin >> word)

iter = lst.insert(iter, word);

新成員

對應的成員

emplace_front

push_front

emplace

insert

emplace_back

push_back

​ 接受物件,然後將物件的拷貝壓入容器

emplace的引數與物件的建構函式有關且必須相匹配

也可以用迭代器begin()end()

if(!c.empty())
提供隨機訪問容器【vector,string,deque,array】都提供下標操作

vectorsvec;	//空svec

刪除元素的成員函式並不檢查其引數,所以在刪除元素之前,程式設計師必須確保他們是存在的

注意點確保非空才能彈出

操作返回void,需要值的話必須在彈出之前儲存

while(!ilist.empty())

erase(iter):刪除迭代器iter指向的元素;返回刪除的最後乙個元素的之後乙個元素

【insert返回的是插入的元素】

//刪除list中所有的奇數元素

listlst = ;

auto it = lst.begin();

while(it != lst.end())

erase(iter1, iter2):刪除iter1和iter2所指向的範圍【左閉右開】中的元素;返回刪除的最後乙個元素的後乙個元素

slist.clear(); //清空元素

slist.erase(slist.begin(), slist.end()); //等價於上式

成員函式

說明c.resize(n)

nc.size(),則新增元素,進行值初始化,若為類型別則呼叫預設建構函式【沒有則報錯】

c.resize(n,t)

調整c的大小到n,並初始化新增的元素為t

listilist(10,42); 	//10個int:每個值都是42

ilist.resize(15); //新增5個為0的int到ilist末尾

ilist.resize(25, -1); //將10個-1的int新增到ilist末尾

ilist.resize(5); //從ilist末尾刪除20個元素

對於deque

對於list 和 forward_list,指向容器的迭代器(包括尾後迭代器和首前迭代器)、指標和引用仍有效。

使用失效的迭代器、指標或引用是嚴重的執行時錯誤。

建議:管理迭代器

當你使用迭代器(或指向容器元素的引用或指標)時,最小化要求迭代器必須保持有的程式片段是乙個好的方法。

由於向迭代器新增元素和從迭代器刪除元素的**可能會使迭代器失效,因此必保證每次改變容器的操作之後都正確地重新定位迭代器。這個建議對vector,strin和deque尤為重要。

新增/刪除vector、string或deque元素的迴圈程式必須考慮迭代器、引用和指標可能失效的問題。程式必須保證每個迴圈步中都更新迭代器、引用或指標。如果迴圈中呼叫的是 insert或erase,那麼更新迭代器很容易。這些操作都返回迭代器,我們可以用來更新:

//傻瓜迴圈,刪除偶元素,複製每個奇元素

vectorvi = ;

auto iter = vi.begin();

while(iter != vi.end())

else

iter = vi.erase(iter); //刪除偶元素

//不必向前移動迭代器,iter已經指向刪除元素的後乙個元素

}

當我們新增/刪除vector或string 的元素後,或在 deque 中首元素之外任何位置新增/刪除元素後,原來end返回的迭代器總是會失效。

因此,新增或刪除元素的迴圈程式必須反覆呼叫end,而不能在迴圈之前儲存end返回的迭代器,一直當作容器末尾使用。

通常c++標準庫的實現中 end ()操作都很快,部分就是因為這個原因。

例子:考慮這樣乙個迴圈,它處理容器中的每個元素,在其後新增乙個新元素。我們希望迴圈能跳過新新增的元素,只處理原有元素。

9 3 順序容器操作

9.3.2 訪問元素 順序容器提供了4種訪問元素的方式 c.front c.back c n c.at n 對於儲存空間連續的容器 vector string deque和array 來說,這4中方式都可以用,可以通過front和back獲得首 尾元素,也可以通過下標運算子和at成員函式訪問任意位置...

順序容器操作2

容器插入 list iterator iter slist.begin iter iter iter slist.insert iter,插入1 cout iter endl for list iterator i slist.begin i slist.end i cout i cout endl...

(52)順序容器操作

順序容器與關聯容器的不同之處在於兩者組織元素的方式。除了array之外,所有標準庫容器都提供了靈活的記憶體管理。在執行時可以動態新增或刪除元素來改變容器的大小。除array和forward list之外,每個順序容器 包括string型別 都支援push back。容器元素是拷貝 當我們用乙個物件來...