学到这里,我们可以提前学习一些STL的内容了,以帮助我们完成作业。本章我们介绍两个容器set、map,它们属于STL中的关联式容器。
包含在头文件< set >,打开C++参考文档,主要关注这样的几个构造函数
image-20231031160917134
cpp展开代码set<int> number;
set<int> number2 = {1,3,9,8,9};
set的创建与vector很类似,尝试着调用以上四种构造方式进行创建,并实现对set中元素的遍历
set的特征:
(1)set中存放的元素是唯一的,不能重复;
(2)默认情况下,会按照元素进行升序排列;
**count:**输入一个值,在set中查找,如果有就返回1,没有就返回0
**find:**输入一个值,在set中进行查找,如果找到,就返回这个元素相应的迭代器。若找不到,则返回end()获取的迭代器。
——请实践一下这两个函数的使用
image-20231031163352909
可以看到insert函数的第一种形式中,参数是一个key,返回的值是一个pair类型(包含一个迭代器和一个bool值)
我们先来看看pair是什么
—— pair定义在头文件< utility >中,类似于结构体,可以存储两种不同类型的变量。
当然,C++中结构体已经演变为了类,所以可以认为一个特定的pair是一个类,包含两个对象成员(它们的类型在定义pair时给出)。
重点关注:pair的对象成员如何访问
cpp展开代码#include <utility>void test1(){ pair<int,string> num = {1,"wangdao"}; cout << num.first << ":" << num.second << endl;}
insert函数的返回类型是pair类型,包含两个对象成员,第一个是对应set的迭代器,第二个是bool值
如果插入成功,则返回“插入元素对应迭代器和true” ;
如果插入失败,则返回**“阻止插入的元素(原本就有的这个元素)对应迭代器和false**”.
cpp展开代码 pair<set<int>::iterator,bool> ret = number.insert(8); if(ret.second){ cout << "该元素插入成功:" << *(ret.first) << endl; }else{ cout << "该元素插入失败,表明该元素已存在" << endl; }
cpp展开代码int arr[5] = {18,41,35,2,99};number.insert(arr,arr + 5); //思考,如果想要插入arr的全部元素,此处应该是arr + 5 还是 arr + 4 ?
注意:
map中存放的元素的类型是pair类型(键值对),构造map需要关注三种方式,也可以把它们结合到一起。如下:
cpp展开代码void test0(){ map<int,string> number = { {1,"hello"}, {2,"world"}, {3,"wangdao"}, pair<int,string>(4,"hubei"), pair<int,string>(5,"wangdao"), make_pair(9,"shenzhen"), make_pair(3,"beijing"), make_pair(6,"shanghai") };
}
使用迭代器方式遍历map,注意访问map的元素pair的内容时的写法
cpp展开代码 map<int,string>::iterator it = number.begin(); while(it != number.end()){ cout << (*it).first << " " << it->second << endl; ++it; } cout << endl;
使用增强for循环变量map
cpp展开代码 for(auto & nu : number){ cout << nu.first << " " << nu.second << endl; }
map的特征:
(1)元素唯一:创建map对象时,舍弃了一些元素,key值相同的元素被舍弃。key不同,即使value相同也能保留
(2)默认以key值为参考进行升序排列
根据key值在map中进行查找
count函数的返回值:如果找到返回1,如果没找到返回0(size_t类型)
find函数的返回值:如果找到返回相应元素的迭代器,如果没找到返回end( )的结果
——请实践一下这两个函数的使用
插入单个元素,此时insert函数的返回值是一个pair(第一个对象成员是map元素相应的迭代器,第二个对象成员是bool值)
cpp展开代码 pair<map<int,string>::iterator,bool> ret = number.insert(pair<int,string>(7,"nanjing")); if(ret.second){ cout << "该元素插入成功" << endl; //ret.first取出来的是指向map元素(pair<int,string>)的迭代器 //再用箭头运算符访问到的是int和string的内容 cout << ret.first->first << " : " << ret.first->second << endl; }else{ cout << "该元素插入失败" << endl; } cout << endl;
插入一组元素
cpp展开代码 //再创建一个map map<int,string> number2 = {{1,"beijing"},{18,"shanghai"}}; //迭代器方式 number2.insert(number.begin(),number.end()); //列表方式 cout << endl; number2.insert({{4,"guangzhou"},{22,"hello"}});
map支持下标操作
map下标操作返回的是map中元素(pair)的value
下标访问运算符中的值代表key,而不是传统意义上的下标
如果进行下标操作时下标值传入一个不存在的key,那么会将这个key和空的value**(默认的value值)**插入到map中
下标访问可以进行写操作
map的元素是pair(key-value),key和value的类型可以自由选择,但要保证key的类型可以进行判重和排序
本文作者:冬月
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!