c++容器的使用,C++的容器
与顺序容器相比,关联容器存储“值”,并配备了一个额外的“键”,以形成“键-值对”。
给定键,您可以直接找到相应的值,而无需遍历整个容器。
默认情况下,存储在顺序容器中的所有元素都是不排序的,而存储在关系容器中的元素则根据每个元素的键值按升序排序。
C STL标准库提供了四个关联容器,分别是map、set、multimap和multiset,底层实现是红黑树。
关联容器名称
特性
地图
在定义头文件中,这个容器中存储的数据的每个元素的键必须是唯一的(即不能重复),容器默认会根据每个元素键的大小进行升序排序(调用std:less)。
设置
在定义头文件中,这个容器中存储的数据,每个元素的键和值都是完全一样的,每个元素的值不能重复(保证每个元素键的唯一性)。容器会根据每个元素的键(实际上是元素值)自动进行升序排序(调用std:less)。
多地图
在定义头文件中,与map容器的唯一区别是multimap容器中存储元素的键可以重复。
多重集
在定义头文件中,与set容器的唯一区别是multiset容器中存储元素的值可以重复(一旦值重复,就意味着键也重复)。
配对类模板
只有当每个键-值对中的所有键和值彼此对应时,它们才能存储在集合和多集合关联容器中,否则,应选择映射或多映射关联容器。
C STL标准库提供了pair类模板来创建一个新元素。第一个、第二个和pair类模板在实用程序头文件中定义。
//创建
//调用默认构造函数1
pair string,double pair1
//调用第二个构造函数
对字符串,字符串对2(1 , a );
//调用复制构造函数
pair string,字符串pair 3(pair 2);
//调用移动构造函数
pair string,string pair4(make_pair(2 , b );//非常好
对字符串,string pair4=make_pair(2 , b );
//调用第五个构造函数
pair string,string pair5(string(3 ),string( c );
//手动赋值
pair 1 . first= 1 ;
pair 1 . second= a ;
地图
使用存储在map容器中的每个键值对,键值既不能重复也不能修改。
//需要包含
#包含地图
使用命名空间std
//模板
模板密钥,//指定密钥的类型。
类,//指定值的类型
Class Compare=less Key,//指定排序规则
Classalloc=分配器对constkey,t//指定分配器对象的类型。
班级地图;
//创建
std:map std:string,int myMap
std:map std:string,int myMap{ {a ,10},{b ,20 } };//在创建时初始化
std:map std:string,int myMap{std:make_pair(a ,10),std:make_pair(b ,20)};//移动分配
std:map std:string,int new map(myMap);//复制赋值
//创建一个将返回临时地图对象的函数
std:map std:string,int disMap() {
std:map std:string,int tempMap{ {a ,10},{b ,20 } };
返回tempMap
}
//调用Map类模板的移动构造函数创建新的map容器
std:map std:string,int new map(disMap());
std:map std:string,int myMap{ {a ,10},{b ,20 } };//指定分配间隔
std:map std:string,int newMap( myMap.begin()、mymap . end());
//排序规则修改
std:map std:string,int myMap{ {a ,10},{b ,20 } };
std:map std:string,int,std:less std:string myMap{ {a ,10},{b ,20 } };
std:map std:string,int,STD:greater STD:string myMap { { a ,10},{b ,20 } };成员方法
功能
开始()
返回一个双向迭代器,指向容器中的第一个(注意,第一个排序的)键值对。如果map容器用const限定,则该方法返回一个const类型的双向迭代器。
结束()
双向迭代器,返回容器中最后一个元素位置之后的位置(注意是排序顺序中的最后一个),通常与begin()结合使用。如果map容器用const限定,则该方法返回一个const类型的双向迭代器。
rbegin()
返回指向最后一个(注意,排序顺序中的最后一个元素)元素的反向双向迭代器。如果map容器用const限定,则该方法返回一个const类型的反向双向迭代器。
呈现()
返回反向双向迭代器,指向第一个(注意是第一个有序)元素的位置之前的位置。如果map容器用const限定,则该方法返回一个const类型的反向双向迭代器。
cbegin()
它的功能和begin()一样,只是在它的基础上增加了const属性,该属性不能用来修改容器中存储的键值对。
cend()
它和end()的功能一样,只是在它的基础上增加了const属性,不能用来修改容器中存储的键值对。
铬开始()
它的功能和rbegin()一样,只是在它的基础上增加了const属性,该属性不能用来修改容器中存储的键值对。
克伦德()
它和rend()的功能一样,只是在它的基础上增加了const属性,不能用来修改容器中存储的键值对。
查找(键)
* *在map容器中查找带有key的键值对,如果查找成功,返回指向键值对的双向迭代器;否则,返回与end()方法相同的迭代器。* *此外,如果映射容器由const限定,该方法将返回一个const类型的双向迭代器。
下限(键)
返回一个双向迭代器,指向当前映射容器中大于或等于key的第一个键值对。如果map容器用const限定,则该方法返回一个const类型的双向迭代器。
上限(关键字)
返回一个迭代器,指向当前地图容器中第一个大于key的键值对。如果map容器用const限定,则该方法返回一个const类型的双向迭代器。
equal_range(键)
该方法返回一个pair对象(包含2个双向迭代器),其中pair.first和lower_bound()方法的返回值是等价的,pair.second和upper_bound()方法的返回值也是等价的。也就是说,该方法将返回包含带有key的键值对的范围(映射容器键值对是唯一的,因此该范围最多包含一个键值对)。
空()
返回true如果容器是空的;否则为假。
大小()
返回当前地图容器中存储的键值对的数量。
max_size()
返回映射容器可以容纳的最大键值对数量。不同的操作系统有不同的返回值。
操作员[]
地图容器重载[]运算符。只要知道map容器中一个键-值对的键的值,就可以像数组中的元素一样,直接通过键获取对应的值。
在(键)
在map容器中查找对应于该键的值。否则,函数将抛出一个out_of_range异常。
插入()
将键值对插入到地图容器中。
擦除()
删除地图容器中指定位置、指定键值或指定区域的键值对。
交换()
交换存储在两个map容器中的键值对,这意味着操作的两个键值对必须是相同的类型。
清除()
清空映射容器中的所有键值对,即使映射容器的大小()为0。
就位()
在当前地图容器中的指定位置构造一个新的键值对。它与插入键值对的效果相同,但效率更高。
定位提示()
本质上,它与在map容器中构造新的键值对的方式相同。不同之处在于,用户必须为这个方法提供一个迭代器,它指示生成键-值对的位置,作为这个方法的第一个参数。
计数(键)
在当前地图容器中,用key查找键值对的个数并返回。注意,由于map容器中每个键值对的键值都是惟一的,因此该函数的最大返回值是1。
地图访问
[]运算符在映射模板中重载。借助下标,可以直接访问数组中的元素,通过指定的键可以获得map容器中键的对应值。
当指定键的键-值对存在于map容器中时,可以借助重载的[]运算符成功获取该键对应的值;相反,如果指定的键没有键-值对,那么使用[]操作符将不再访问容器中的元素,而是向map容器添加一个键-值对。其中,键-值对的键使用[]运算符中指定的键,其对应的值取决于map容器指定的键-值对中值的数据类型。如果是基本数据类型,值为0;如果是字符串类型,其值为“”,即空字符串(即该类型的默认值作为键-值对的值)。
string cValue=myMap[ a ];
使用at()成员方法获取对应于地图容器中指定键的值。at()成员方法还需要根据指定的键从容器中找到键对应的值。如果在当前容器中搜索失败,将直接抛出out_of_range异常。
借助Find()成员方法找出指定的键是否存在于map容器中。如果返回一个迭代器,即搜索成功,迭代器指向找到的键值对;否则,它指向map容器的最后一个键值对之后的位置(与end () success方法返回的迭代器相同)。
地图插入
//1,使用重载的[]
//2、insert()
//将键值对直接添加到地图容器中,而不指定插入位置-
//1.通过引用传递键值对。
对迭代器,bool insert(const value _ type val);
//2.通过右值引用传递键值对。
模板类P
对迭代器,bool insert(P val);
//示例
//创建一个空的地图容器
std:map string,string mymap
//创建一个实键值对变量
std:pair string,string STL={ a , 1 };
//创建一个接收insert()方法返回值的pair对象
std:pair std:map string,string :iterator,bool ret
//插入STL。由于STL不是一个临时变量,所以它将以第一种方式传递。
ret=mymap . insert(STL);
//传递一个临时键值对变量作为右值引用。
ret=mymap.insert({ b , 2 });
//插入失败的样本
ret=mymap.insert({ a , 3 });//发现映射包含“A”并返回false
insert()方法还支持将新的键值对插入到地图容器的指定位置-
//将val参数作为普通引用传递
迭代器插入(const_iterator position,const value _ type val);
//将val键值对参数作为右值引用传递
模板类P
迭代器插入(const_iterator position,P val);
//如果插入成功,insert()方法会返回一个迭代器,指向map容器中插入的键值对;
//如果插入失败,insert()方法也将返回一个迭代器,该迭代器指向map容器中与val具有相同键的键-值对。
//即使指定了新键值对的插入位置,映射容器仍将对存储的键值对进行排序。也可以说,决定新插入的键-值对在map容器中的位置的不是
insert()方法中传递的迭代器,而是新的键-值对中的键值。
insert()方法还支持将其他地图容器指定区域的所有键值对插入到当前地图容器中-
模板类输入运算符
void insert(先输入运算符,后输入运算符);
//示例
insert()方法还允许一次将多个键值对插入到地图容器中-
空插入({val1,val2,});
mymap.insert({ {a , 1},
{ b , 2 },
{ c , 3 } });
//使用launte()或launte _ hont()比insert()更高效。
模板类.一个参数名
成对迭代器,布尔定位(参数.args);
//返回值也是一个pair对象,其中pair.first是迭代器,pair.second是bool类型变量:
//当这个方法成功地在map容器中插入一个键值对时,它返回的迭代器指向新插入的键值对,bool变量的值为true;
//当插入失败时,表示map容器中存在具有相同键的键值对。此时返回的迭代器指向这个具有相同键的键-值对,bool变量的值为
//假.
pair map string,string :iterator,bool ret=mymap . launte( a , 1 );
模板类.一个参数名
迭代器位置提示(常量迭代器位置,参数.args);
//需要传递位置,返回迭代器
//指定在映射容器中插入键值对
map string,string:iterator ITER=mymap . launte _ hint(mymap . begin(), a , 1 );
mulimap
multimap容器具有和map相同的特性,即multimap容器也用于存储pair const K,T类型的键-值对(其中K表示键的类型,T表示值的类型),其中每个键-值对的键值都不能修改;此外,容器将根据键的大小对所有存储的键-值对进行排序。map容器和MAP容器的区别在于,multimap容器中可以同时存储多个(2)具有相同键的键-值对。
与map容器相比,multimap不提供at()成员方法,也不重载[]运算符。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。