南宁网站建设方案报价,装修设计师在哪里找,中国反钓鱼网站联盟,宁波建设网图文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器
什么是关联式容器#xff1f;它与序列式容器有什么区别#xff1f; 关联式容器也是用来存储数据的#xff0c;与序列式容器不同的是#xff0c;其里面存储的是key#xff0c;value结… 文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器
什么是关联式容器它与序列式容器有什么区别 关联式容器也是用来存储数据的与序列式容器不同的是其里面存储的是keyvalue结构的键值对在数据检索时比序列式容器效率更高。这里的序列是容器是指vectorlist、deque的底层。 键值对 键值对我们可以把它理解为英语单词对应中文意义的一种映射关系。该结构中一般只包含两个成员变量key和valuekey代表键值value表示与key对应的value也就是英语单词的中文意思。 templateclass T1,class T2
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair():first(T1()),second(T2()){}pair(const T1 a, const T2 b):first(a),second(b){}
};树型结构的关联式容器 根据应用场景的不同STL总共实现了两种不同结构的管理式容器树型结构与哈希结构。树型结构的关联式容器主要有四种map、set、multimap、multiset。这四种容器的共同点是使用平衡搜索树即红黑树作为其底层结果容器中的元素是一个有序的序列平衡二叉搜索树中序遍历可以得到一个有序的序列。 set的介绍 与map/multimap不同map/multimap中存储的是真正的键值对key,valueset中只存放value但在底层实际存放的是由value,value构成的键值对。 set中插入元素时只需要插入value即可不需要构造键值对。 set中的元素不可以重复(因此可以使用set进行去重)。 使用set的迭代器遍历set中的元素可以得到有序序列 set中的元素默认按照小于来比较 set中查找某个元素时间复杂度为 l o g 2 n log_2 n log2n set中的元素不允许修改 set中的底层使用二叉搜索树(红黑树)来实现 T: set中存放元素的类型实际在底层存储value, value的键值对。 Compareset中元素默认按照小于来比较 Allocset中元素空间的管理方式使用STL提供的空间配置器管理 使用set的一些代码
int main()
{setint myset;for (int i 1; i 10; i){myset.insert(i*10);}setint::iterator itlow, itup;//取相邻的数字itlow myset.lower_bound(35); // 35itup myset.upper_bound(60); // 60cout *itlow endl;cout *itup endl;myset.erase(itlow, itup);for (auto e : myset){cout e endl;}return 0;
}int main()
{setint myset;//set是去重的这里的代码没有意义要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i 1; i 10; i){myset.insert(i*10);}auto ret myset.equal_range(10);setint::iterator itlow, itup;itlow ret.first;itup ret.second;cout *itlow endl;cout *itup endl;return 0;
}void test_set()
{multisetint myset;set是去重的这里的代码没有意义要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i 1; i 10; i){myset.insert(i * 10);}auto ret myset.equal_range(10);multisetint::iterator itlow, itup;itlow ret.first;itup ret.second;cout *itlow endl;cout *itup endl;for (auto e : myset){cout e ;}cout endl;myset.erase(itlow, itup);for (auto e : myset){cout e ;}
}map的介绍 map是关联容器它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。在map中键值key通常用于排序和惟一地标识元素而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同并且在map的内部key与value通过成员类型 value_type绑定在一起为其取别名称为pair: typedef pairconst key, T value_type;在内部map中的元素总是按照键值key进行比较排序的。map中通过键值访问单个元素的速度通常比unordered_map容器慢但map允许根据顺序 对元素进行直接迭代(即对map中的元素进行迭代时可以得到一个有序的序列)。map支持下标访问符即在[]中放入key就可以找到与key对应的value。map通常被实现为二叉搜索树(更准确的说平衡二叉搜索树(红黑树))。 key: 键值对中key的类型 T 键值对中value的类型 Compare: 比较器的类型map中的元素是按照key来比较的缺省情况下按照小于来比 较一般情况下(内置类型元素)该参数不需要传递如果无法比较时(自定义类型)需要用户 自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递) Alloc通过空间配置器来申请底层空间不需要用户传递除非用户不想使用标准库提供的 空间配置器 注意在使用map时需要包含头文件。 使用map的一些代码
void test_map()
{mapstring, string mymap;//初始化map的方式pairstring, stringkv(sort, 排序);mymap.insert(kv);mymap.insert(pairstring, string(string, 字符串));mymap.insert(make_pair(insert, 插入));//map也有去重功能。 不插入不覆盖插入过程中只比较key不管valuekey相同就不可以插入了//C11支持这样写mymap.insert({ insert,xxx });mapstring, string::iterator it mymap.begin();while (it ! mymap.end()){cout it-first : it-second endl;it;}cout endl;//范围forfor (const auto kv : mymap){cout kv.first : kv.second endl;}
}好的我们下一篇再见