目錄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()
提供隨機訪問容器【vector,string,deque,array】都提供下標操作if(!c.empty())
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
對於dequelistilist(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個元素
對於list 和 forward_list,指向容器的迭代器(包括尾後迭代器和首前迭代器)、指標和引用仍有效。
使用失效的迭代器、指標或引用是嚴重的執行時錯誤。
建議:管理迭代器新增/刪除vector、string或deque元素的迴圈程式必須考慮迭代器、引用和指標可能失效的問題。程式必須保證每個迴圈步中都更新迭代器、引用或指標。如果迴圈中呼叫的是 insert或erase,那麼更新迭代器很容易。這些操作都返回迭代器,我們可以用來更新:當你使用迭代器(或指向容器元素的引用或指標)時,最小化要求迭代器必須保持有的程式片段是乙個好的方法。
由於向迭代器新增元素和從迭代器刪除元素的**可能會使迭代器失效,因此必保證每次改變容器的操作之後都正確地重新定位迭代器。這個建議對vector,strin和deque尤為重要。
當我們新增/刪除vector或string 的元素後,或在 deque 中首元素之外任何位置新增/刪除元素後,原來end返回的迭代器總是會失效。//傻瓜迴圈,刪除偶元素,複製每個奇元素
vectorvi = ;
auto iter = vi.begin();
while(iter != vi.end())
else
iter = vi.erase(iter); //刪除偶元素
//不必向前移動迭代器,iter已經指向刪除元素的後乙個元素
}
因此,新增或刪除元素的迴圈程式必須反覆呼叫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。容器元素是拷貝 當我們用乙個物件來...