(52)順序容器操作

2021-07-29 12:47:39 字數 2933 閱讀 2722

順序容器與關聯容器的不同之處在於兩者組織元素的方式。

除了array之外,所有標準庫容器都提供了靈活的記憶體管理。在執行時可以動態新增或刪除元素來改變容器的大小。

除array和forward_list之外,每個順序容器(包括string型別)都支援push_back。

容器元素是拷貝:當我們用乙個物件來初始化容器時,或將乙個物件插入到容器時,實際上放入到容器中的是物件值的乙個拷貝,而不是物件本身。

此操作將元素插入到容器頭部。list、forward_list和deque容器支援push_front操作,vector不支援。

insert成員提供了更一般的新增功能,它允許我們在容器中任意位置插入0個或多個元素。vector、list、deque和string都支援insert成員。forward_list提供了特殊版本的insert成員。

將元素插入到vector、deque和string中的任何位置都是合法的。然而這樣做可能很耗時。

inset的幾個版本:

一. 第乙個引數為迭代器,例如:

vectorsvec;

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

二. 接受乙個元素數目和乙個值,它將指定數目的元素新增到指定位置之前,這些元素都按給定值初始化:

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

//這行**將10個元素插入到svec的末尾,並將所有元素都初始化為string「anna」

三.接受一對迭代器或乙個初始化列表:

listslist;

vectorv = ;

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

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

slist.insert(slist.end(), );

//執行時錯誤:迭代器表示要拷貝的範圍,不能指向與目的位置相同的容器

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

在新標準下,接受元素個數或範圍的insert版本返回指向第乙個新加入元素的迭代器。

通過使用insert的返回值,可以在容器中乙個特定位置反覆插入元素:

listlst;

auto iter = lst.begin();

while (cin >> word)

新標準引入了三個新成員——emplace_front,emplace和emplace_back,這些操作構造而不是拷貝元素,分別對應push_front、insert和push_back。

emplace函式在容器中直接構造元素。傳遞給emplace函式的引數必須與元素型別的建構函式相匹配。

包括array在內的每個順序容器都有乙個front成員函式,而除了forward_list之外的所有順序容器都有乙個back成員函式。這兩個操作分別返回首元素和尾元素的引用。

在容器中訪問元素的成員函式(即,front、back、下標和at)返回的都是引用,如果容器是乙個const物件,則返回值是const的引用。

非array容器的刪除函式:

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

我們可以用resize來增大或縮小容器,array不支援。

例如:

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

ilist.resize(15); //將5個值為0的元素新增到ilist的末尾

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

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

如果當前大小大於所要求的大小,容器後部的元素會被刪除;如果當前大小小於新大小,會將新元素新增到容器後部。

向容器中新增/刪除元素的操作會使指向容器元素的指標、引用或迭代器失效,乙個失效的指標、引用或迭代器將不再表示任何元素。

新增元素:

1)如果容器是vector或string,且儲存空間被重新分配,則指向容器的迭代器、指標和引用都會失效。如果儲存空間未被重新分配,指向插入位置之前的元素的迭代器、指標和引用仍有效,但指向插入位置之後元素的

迭代器、指標和引用將會失效

2)對於deque,插入到首位之外的任何位置都會使迭代器、指標和引用失效。如果在首尾位置新增元素,迭代器會失效,但指向存在的元素的引用和指標不會失效。

3)對於list和forward_list,指向容器的迭代器、指標和引用仍然有效。

刪除元素:

1)對於list和forward_list,指向容器的迭代器、指標和引用仍然有效。

2)對於deque,如果在首尾之外的任何位置刪除元素,那麼指向被刪除元素外其它元素的迭代器、引用和指標也會失效。如果是刪除deque的尾元素,則尾後迭代器也會失效,但其它迭代器、引用和指標不收影響;如果刪除首元素,這些也不會受影響。

3)對於vector和string,指向被刪元素之前元素的迭代器、引用和指標仍有效。

當我們刪除元素時,尾後迭代器總是會失效。

順序容器操作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...

9 3 順序容器操作

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

9 3 順序容器操作

目錄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 ...