順序容器與關聯容器的不同之處在於兩者組織元素的方式。
除了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 ...