关联容器总结
来源:互联网 发布:网络用户主要是 编辑:程序博客网 时间:2024/06/10 02:35
关联容器
1.简介
1.1 定义
关联容器(associativecontainer)通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
“容器元素根据键的次序排列”这一事实就是一个重要的结论:在迭代遍历关联容器时,我们可确保按键的顺序访问元素,而与元素在容器中的存放位置完全无关。
1.2 引言:pair类型
头文件:#include <utility>
1.2.1 创建pair对象
pair<T1, T2> p1 创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化
pair<T1, T2> p1(v1, v2) 创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,而second成员初始化为v2
make_pair(v1, v2) 以v1和v2值创建一个新的pair对象,其元素类型分别是v1和v2的类型
1.2.2 pair对象的操作
对于pair类,可以直接访问其数据成员:其成员都是公有的,分别命名为first和second,只需使用普通的点操作符---成员访问标志,即可访问其成员。
举例:
pair<string,string> name(“feng”, “di”);
name.first = “feng”
name.second = “di”
2.map类型
2.1 map对象的定义
map的构造函数
map<k, v> m; 创建一个名为m的空map对象,其键和值的类型分别为k和v
map<k, v> m(m2); 创建m2的副本m,m与m2必须有相同的键类型和值类型
map<k, v> m(b, e); 创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair<const k, v>
注意:在实际应用中,键类型必须定义 < 操作符,而且该操作符应能“正确的工作”,这一点很重要。
2.2 map定义的类型
map<k, v>::key_type 在map容器中,用作索引的键的类型
map<k, v>::mapped_type 在map容器中,键所关联的值的类型
map<k, v>::value_type 一个pair类型,它的first元素具有constmap<k, v>::key_type类型,而second元素具有map<k ,v>::mapped_type类型
注意:需谨记value_type是pair类型,它的值成员可以修改,但键成员不能修改。
2.3 给map添加元素
2.3.1 使用下标操作符实现
先用下标操作符获取元素,然后给获取的元素赋值
举例:
map<”string”,“int”> word_count;
word_count[“Anna”]= 1;
注意:使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致map容器中添加一个新的元素,它的键即为该下标值。
2.3.2使用insert()成员实现
m.insert(e) e是一个用在m上的value_type类型的值。
如果键(e.first)的在值不在m中,则插入一个值为e.second的新元素;如果该键在m中已经存在,则保持m不变。
该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。
m.insert(beg, end) beg和end是标记元素范围的迭代器,其中的元素必须是m.value_type类型的键-值对。
对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。返回void类型。
m.insert(iter, e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素的存储的位置。返回一个迭代器,指向m中具有给定键的元素。
2.4 查找并读取map中的元素
2.4.1 使用下标操作
举例:
map<string, int> word_count;
int occurs = word_count[“Anna”];
注意:如果Anna不是map中的键,那么就会插入一个新的元素。所以一般只读取元素很少用下标操作去完成。
2.4.2 不修改map对象的查询操作
m.count(k) 返回m中k的出现次数
举例:
int occurs = 0;
if(word_count.count(“Anna”) != 0)
{
occurs= word_count[“Anna”];
}
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
举例:
int count = 0;
map<string, int>:: iterator iter = word_count.find(“Anna”);
if (iter != word_count.end())
{
occurs= iter->second;
}
注意:对于map对象,count成员的返回值只能是0或1。map容器只允许一个键对应一个实例,所以count可有效地表明一个键是否存在。
2.5从map对象中删除元素
m.erase(k) 删除m中键为k的元素。返回size_type类型的值,表示删除的元素个数
m.erase(p) 从m中删除迭代器p所指向的元素。P必须指向m中确实存在的元素,而不能等于m.end()。返回void类型
m.erase(b, e) 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中的一段有效范围;即b和e都必须指向m中的元素或最后一个元素的下一位置。而且,b和e要么相等(此时删除的范围为空),要么b所指向的元素出现在e所指向的元素之前,返回void类型
注意:始终记住map中的元素的键—值是一对一的。
2.6 map对象的迭代遍历
举例:
map<string, int>::const_iteratormap_it = word_count.begin();
while(map_it != word_count.end())
{
cout<< map_it->first << “occurs”
<< map_it->second << “times”<< endl;
++map_it;
}
3.set类型
3.1 set类型的定义:
set容器只是单纯的键的集合,
而map容器时键-值对的集合。
注意:当只想知道一个值是否存在时,使用set容器是最合适的。
set容器支持大部分的map操作,包括:构造函数,insert操作,count和find操作,以及erase操作。
3.2 set类型与map类型的区别
类型/操作
map
set
下标操作
支持
不支持
是否定义mapped_type类型
定义
没定义
value_type
pair<const key_type, mapped_type>
const key_type
4. multimap和multiset类型
4.1 特点
map和set容器中,一个键只能对应一个实例。而multimap和multiset类型允许一个键对应多个实例。
multimap和multiset所支持的操作分别与map和set的操作相同,只有一个例外:multimap不支持下标运算。因为某个键可能对应多个值。
4.2 返回迭代器的关联容器操作
m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素
m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素
m.equal_range(k) 返回一个迭代器的pair对象
它的first成员等价于m.lower_bound(k)。而second成员则等价于m.upper_bound(k)
注意:lower_bound和upper_bound,适用于所有的关联容器,但更常用于multimap和multiset。
所有操作都需要传递一个键,并且返回一个迭代器。
- 关联容器总结
- C++ 关联容器总结
- c++关联容器总结
- 容器总结——关联式容器
- c++ primers关联容器map代码总结
- 关联容器的基本操作简单总结
- 关联容器的基本操作简单总结
- STL2—关联容器map基础总结
- STL2—关联容器map基础总结
- [C++ 面试基础知识总结] 关联容器
- STL之顺序容器和关联容器总结
- 顺序容器vector 与 关联容器map的总结
- 【STL】STL之顺序容器和关联容器总结
- 关联容器
- 关联容器
- 关联容器
- 关联容器
- 关联容器
- jQuery对象与dom对象的转换
- 进程隐藏与进程保护(SSDT Hook 实现)(三)
- escape,encodeURI,encodeURIComponent该用哪一个?
- 邻接表
- 电脑黑客用3D打印钥匙解开高安全性能手铐
- 关联容器总结
- 前端er干干净净打印百度地图的方法
- Flex跨域问题
- T-SQL教程-5
- 2010年精选的101个最佳Photoshop设计教程
- linux测试硬盘读写速度
- ubuntu vnc配置
- Android中ListView中有button,checkbox,GridView的用法【安卓进化二十五】
- c#创建windows service示例 .