C++ STL 概述_嚴絲合縫的合作者們( 三 )

輸出結果:
jone 2rose 12.2.2 添加數據一般要求容器組件提供對數據進行常規維護的方法(增、刪、改、查……) 。
STL2類容器提供了insert方法,可以在指定的位置為容器加入新的數據 。

這里需要注意:STL位置一般用迭代器描述,而不是索引位置 。
// 初始化向量vector<int> vec {1, 2, 3, 4, 5};//開始迭代器vector<int>::iterator begin=vec.begin();//結束迭代器vector<int>::iterator end=vec.end();cout<<"原向量容器數據"<<endl;for(; begin!=end; begin++) {cout<<*begin<<"\t";}//重置開始位置begin=vec.begin();// 指向容器vec的第三個元素begin =begin + 2;//在位置 3 插入數據vec.insert( begin, 6 );//重置開始和結束位置begin=vec.begin();end=vec.end();cout<<"\n插入數據后:"<<endl;for(; begin!=end; begin++) {cout<<*begin<<"\t";}輸出結果:
C++ STL 概述_嚴絲合縫的合作者們

文章插圖
關聯式容器的插入數據效果和序列式容插入效果會有不同 。
  • 序列式容器中插入數據后,期望位置和最終結果位置是一樣的 。如期望插入在第 3 個數據之后 , 實際也是插入在第 3 個數據之后 。
  • 關聯式容器會自動按進行位置重排,會出現期望位置和最終位置不一樣的情況(特別在以紅黑樹存儲數據時,為了保持平衡性,會對數據進行平衡處理) 。

C++ STL 概述_嚴絲合縫的合作者們

文章插圖
STL還為序列式容器提供了push、push_back、push_front方法 , 此方法只能在容器頭或容器尾進行數據添加 。
// 聲明一個向量vector<int> vec(10);// 壓入數據vec.push_back(1);vec.push_back( 1 );vec.push_back( 2 );// 聲明一個鏈表list<int> ls(10);// 壓入數據ls.push_back( 1 );ls.push_front( 2 );// 聲明一個棧,棧只有 push 方法stack<string> st;// 壓入數據st.push("A");2.2.3 刪除數據STL的容器都有 erase方法,用來刪除指定位置或區間的數據 。也提供有clear方法,用來清除整個容器 。
位置和區間都需使用迭代器指定 。
// 初始化向量vector<int> vec{1, 2, 3, 4, 5, 6};//指向容器vec的第三個元素vector<int>::iterator iter = vec.begin() + 2;// 刪除第三個元素vec.erase(iter);//指向容器vec的第三個元素iter = vec.begin() + 2;// 刪除第二個元素之后的所有元素vec.erase(iter, vec.end() );// 構造一個集合set<int> intSet( ary1, ary1+5 );// 刪除鍵值為4的元素(集合的鍵值與實值是一致的)intSet.erase( 4 );2.2.4 查找數據序列式容器沒有提供查找方法,但是,如果某容器類重載了[]運算符,則可以通過給定數據的索引號找到相應數據,也可以通過 at方式進行查找 。
// 初始化向量vector<int> vec{1, 2, 3, 4, 5, 6};int tmp= vec[2];cout<<tmp<<endl;//效果上面一樣tmp= vec.at(2);cout<<tmp<<endl;序列式容器一般都會提供frontback方法,用來返回第一個和最后一個數據 。因為棧的特殊性,只有top方法用來返回棧頂數據 。
vector<int> vec {1, 2, 3, 4, 5, 6};list<int> intList( vec.begin(), vec.end() );//返回第一個數據x = intList.front();//返回最后一個數據x = intList.back();stack<int,vector<int> > st;//返回棧頂數據x = st.top();關聯式容器提供有專門的find方法,可通過指定鍵值進行查找 , 注意,返回的是用迭代器所描述的位置 。
// 整數型數組int ary[5] = { 3, 1, 5, 2, 4};// 構造集合set<int> intSet( ary, ary+5 );// 查找集合中鍵值為4的元素set<int>::iterator iter = intSet.find( 4 );//輸出cout<<*iter<<endl;基于組件的分工合作設計思想,容器自身的查找只會提供一些基本功能 。當有更復雜的查找需求時,可以使用STL算法中相應的函數模板進行查詢,例如find,find_iffind_endfind_first_of 。
2.2.5 修改數據可以先查找到要修改的數據,然后直接修改,如果查找數據時返回的是迭代器,則可以通過迭代器進行修改 。
// 構造向量vector<int> vec{ 3, 1, 5, 2, 4};//直接修改vec[3] =9;//[] 反回的是向量數據的引用int &refTmp=vec[3];//和前面的直接修改一樣refTmp=9;map<int,int>myMap();//按鍵值查找,返回迭代器map<int,int>::iterator iter=myMap.find(10);//通過迭代器修改iter->second=8;//和上面的效果一樣myMap[10]=8;

推薦閱讀