输出结果:
jone 2rose 1
2.2.2 添加数据一般要求容器组件提供对数据进行常规维护的方法(增、删、改、查……) 。
STL
为 2
类容器提供了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";}
输出结果:文章插图
关联式容器的插入数据效果和序列式容插入效果会有不同 。
- 序列式容器中插入数据后,期望位置和最终结果位置是一样的 。如期望插入在第
3
个数据之后 , 实际也是插入在第3
个数据之后 。 - 关联式容器会自动按
键
进行位置重排,会出现期望位置和最终位置不一样的情况(特别在以红黑树存储数据时,为了保持平衡性,会对数据进行平衡处理) 。
文章插图
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;
序列式容器一般都会提供front
和back
方法,用来返回第一个和最后一个数据 。因为栈的特殊性,只有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_if
,find_end
和find_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;
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
- C++自学笔记 Composition:对象组合
- 关于二季度经济情况的概述
- 如何使用westlaw
- 2013年千足金价格多少一克 2013千足金价格多少一克
- 关于平台层和采集层的概述
- 中国饮食文化概论介绍 中国饮食文化概述
- 老人与海主要内容及赏析 老人与海的主要内容概述
- 单位优秀工作总结范文 优秀单位工作总结5篇
- 自动变速器工作原理(一、自动变速器概述 自动变速器的原理是什么