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算法中相应的函数模板进行查询,例如findfind_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;

推荐阅读