STL对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。
顺序性容器:vector、list、deque
关联性容器:set、multiset、map、multimap
容器适配器:stack、queue、priority_queue
本篇主要总结关联性容器:
(btw:获取迭代器的方法:建对象方式::iterator iter; //例:map<int,string>::iterator iter; )
1.set:
set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。
(1)初始化set对象的方式:
set<int > seta; //默认是小于比较器less<int>的set
set<int, greater<int> > setb; //创建一个带大于比较器的set,需包含头文件functional
int a[5] = {1,2,3,4,5};set<int > setc(a,a+5); //数组a初始化一个set;set<int > setd(setc.begin(),setc.end()); //setc初始化一个set//上述两例均为区间初始化
set<int > sete(setd); //拷贝构造创建set
(2)set常用函数:
s.begin() 返回set容器的第一个元素
s.end() 返回set容器的最后一个元素
s.clear() 删除set容器中的所有的元素
s.empty() 判断set容器是否为空
s.insert() 插入一个元素
s.erase() 删除一个元素
s.size() 返回当前set容器中的元素个数
s.count() 返回某个值元素的个数
equal_range() 返回第一个>=关键字的迭代器和>关键字的迭代器
语法:
pair <iterator,iterator>equal_range( const key_type &key );
//key是用于排序的关键字Set<int> ctr;
例如:
Pair<set<int>::iterator,set<int>::iterarot>p; For(i=0;i<=5;i++) ctr.insert(i); P=ctr.equal_range(2);
那么*p.first==2;*p.second==3;
erase() 删除集合中的元素
语法:
iterator erase( iterator i ); //删除i位置元素
iterator erase( iterator start, iterator end );
//删除从start开始到end(end为第一个不被删除的值)结束的元素size_type erase( const key_type &key );
//删除等于key值的所有元素(返回被删除的元素的个数)
//前两个返回第一个不被删除的双向定位器,不存在返回末尾
//第三个返回删除个数
find() 返回一个指向被查找到元素的迭代器
语法:
iterator find( const key_type &key );
//查找等于key值的元素,并返回指向该元素的迭代器;
//如果没有找到,返回指向集合最后一个元素的迭代器
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数
2.multiset
set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。multiset和set用法基本一致。
3.map
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,使用的是一个包含键和值的pair的对象。由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。
(1)初始化map对象的方式:
map<key,value>m; //创建一个名为m的空map对象,其键和值的类型分别为key和value。
map<key,value>m(m2); //创建m2的副本m,m与m2必须有相同的键类型和值类型。
map<key,value>m(b,e); //创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair
map<key,value,comp>m; //comp可选,为键值对存放策略,即键的比较函数,默认标准库使用键类型定义的 < 操作符来实现键的比较。所用的比较函数必须在键类型上定义严格的弱排序,可将其理解为键类型数据上的“小于”关系。在实际应用中,键类型必须能定义 < 操作符。对于键类型,其唯一的约束就是必须支持 < 操作符。
(2)map常用函数
四种插入数据的方法:
1.insert(pair<int, string>(1, "student_one")): //用insert函数插入pair元素
2.insert(map<int, string>::value_type (1, "student_one")); // 用insert函数插入value_type数据
3. map<char, string>,char c='1',mp[c]="student_one" //用数组方式插入数据
4.map.insert(make_pair(1, "student_one")); //在insert函数中使用make_pair()函数
begin():返回容器第一个元素的迭代器
end():返回容器最后一个元素之后的迭代器
rbegin():返回一个指向map尾部的逆向迭代器
rend(): 返回一个指向map头部的逆向迭代器
clera():清除容器中所有元素
empty():判断容器是否为空
size():返回容器中元素的个数
count(k):返回指定键等于k的数据的出现的次数
find(k) :如果m中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回结束游标end()
get_allocator():返回map的配置器
swap():交换两个map容器的元素
erase(k); // 删除m中键为k的元素,返回size_type类型的值,表示删除元素的个数。erase(p); // 从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,而且不能等于m.end(),返回void类型。
erase(iterator first, iterator last); // 删除一个范围,返回void类型。
4.multimap
multimap中的键也是按照构造函数中所指定的二元谓词进行排序的。
multimap的元素类型和map是一致的,这里就不再赘述。
这里就简要概述一下multimap和map不同的地方:multimap中相同的键可以多次出现,而不像map只能出现一次。 在multimap中没有定义[]运算符,当然也没有定义at()成员函数,因此,multimap进行插入的时候,只能利用insert()函数进行插入。
访问一个键的区间的三种方式
(1)通过其实点和数量来访问,即find(k)和count(k)
multimap<string,int>::iterator it;
int num=m.count("Jack");
it = m.find("Jack");
cout<<"the search result is :"<<endl;
for(int i=1;i<=num;i++)
{
cout<<(*it).first<<" "<<(*it).second<<endl;
it++;
}
(2)通过起始点和结束点,即lowerbound()和upper_bound()
(3)equal_range();
pair<iterator,iterator> equal_range(const key_type& k) const;//返回的pair对象,
//first为lower_bound(k);大于等于k的第一个元素位置
//second为upper_bound();大于k的第一个元素位置
第一篇:C++的STL容器之顺序性容器vector、list、deque
链接:https://blog.csdn.net/baodream/article/details/79719091
第三篇:C++的STL容器之关联性容器stack、queue、priority_queue
链接: https://blog.csdn.net/baodream/article/details/79732680