一个好网站建设,wordpress怎么添加ga统计,自己做微信团购小程序,wordpress 如何购买主题【C】序列与关联容器#xff08;三#xff09;map与multimap容器 一、map二、multiset / multimap 一、map
树中的每个结点的类型是一个std::pair //pair的类型是const key,value pair是一个包含两个指针的结构体#xff0c;第一个指针指向该节点的key#xff0c;… 【C】序列与关联容器三map与multimap容器 一、map二、multiset / multimap 一、map
树中的每个结点的类型是一个std::pair //pair的类型是const key,value pair是一个包含两个指针的结构体第一个指针指向该节点的key第二个指针指向该节点的value。键(pair.first) 需要支持使用 比较大小或者采用自定义的比较函数来引入大小关系访问元素find / [] / at map初始化
mapint, bool m{ {3,true} ,{ 2,false } ,{5,true} };打印map中的数据
使用range_based for方式
for (auto p : m)
{cout p.first p.second endl;
}使用pair方式
for (auto ptr m.begin(); ptr ! m.end(); ptr)
{auto p *ptr; //pair的类型是const int, boolcout pair.first pair.second endl;
}使用绑定函数方式
for (auto [k,v] : m)//拷贝方法
{cout k v endl;
}for (auto [k,v] : m)//直接使用引用的方法
{cout k v endl;
}访问map中的数据 注意[]方式的使用 如果[]中输入的key值在已定义的map中并不存在系统并不会返回不存在这样的信息而是会新建一个该key值对应的节点并把value隐式的初始化为0。 如下
mapint, bool m{ {3,true} ,{ 2,false } ,{5,true} };
cout m[100] endl;由于我们并未定义一个key为100的结点故系统在m中找不到该节点之后就自行定义了该节点并把节点的value值初始化为0。故该输出结果为0。 但是其他的访问方式如atfind都会输出报错访问越界。而不会新建。 所以使用[]运算符不可以操作常量对象如
const mapint, bool m{ {3,true} ,{ 2,false } ,{5,true} };
cout m[100] endl;这样就是错的。因为常量对象不可修改不可写但是[]运算符在查找不到该节点的时候就会新增一个节点相当于企图修改该常量对象那就是错误的。
那对于常量对象如何访问元素呢答案是使用find或者at。
const mapint, bool m{ {3,true} ,{ 2,false } ,{5,true} };
auto ptr m.find(3);
if (ptr ! m.end())
{cout ptr-second endl;
}二、multiset / multimap
set,map,multiset,multimap都是基于红黑树实现的其放入节点后都会自动排序排序结果是按照键值key从小到大的排序。 multiset,multimap相比于set,map多的特性就是允许重复键。 如下代码输出结果是 1 3但是我们初始化的时候是1 3 1。由此可见set把重复的值进行了合并只会保留一个。
setint m { 1,3,1 };
for (auto p : m)
{cout p endl;
}但是把set换为multiset之后打印结果就变为了1 1 3。
multisetint m { 1,3,1 };
for (auto p : m)
{cout p endl;
}元素访问其余的和setmap类似下面几个只是针对他可以存储重复结点而多出的相对特殊的特点方法
find 返回首个查找到的元素count 返回元素个数lower_bound / upper_bound / equal_range 返回查找到的区间