C++的STL容器之关联性容器set、multiset、map、multimap

时间:2021-09-22 20:48:12

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