C++ STL容器之 map

C++ STL容器之 map,第1张

map 是一种有序无重复的关联容器

关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按照它们在容器中的位置保存和访问的。

map保存的是一种 key - value 的pair对象,其中 key 是关键字,value 是关键字对应的值。通过 key找到对应的 value。map中按照 key的大小升序排列pair对象。

其中key 是 const的,即不可以改变map中的key。

在map中定位特定的元素比 unordered_map 要慢,因为在 map中需要根据 key的大小进行顺序查找。但是在map中允许直接选取一定范围的元素

map在底层通常用二叉搜索树实现。

begin, end, rbegin, rend

cbegin, cend, crbegin, crend

map 的迭代器支持 ++, -- *** 作,但是不支持 +i *** 作。

注意 map中是根据 key的值来排列元素的位置的,所以通过迭代器遍历出来的结果顺序,可能和插入值的顺序不同。

另外对 map的迭代器解引用的结果是得到一个 pair类型的对象。它有两个共有成员 first, second。first保存 key的值,second 保存value的值。

由于map的 key 是 const的,所以得到的 pair 的first 也是const 的。

容量

元素访问

修改

*** 作

先一一解答:

stl 是标准模板库,起个简化作用(也就是程序员可以偷懒,直接调用用别人的代码

MFC=Microsoft Foundation Classes(微软基础类):作用是快速可以快速开发软件,可以去这看看>

理论是可以的。比如:

#include <list>

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >

class mylist : public std::list<_Tp, _Alloc>

{

public:

    // 你的扩充代码 

};

不过从比较严格的编码规范来说,不太推荐从STL容器继承。因为,严格的说,一个类如果它允许有派生类,它的析构数应该被定义虚函数,而STL容器的析构函数并没有被定义的虚函数。

最安全的方式是使用组合及代理的模式。不过使用组合并不优雅,你需要增加好多重复的代码(要把list的每个函数重新定义一次 :()。

一些常见的容器选择问题

你是否需要在容器的任意位置插入新元素?

如果需要,就选择序列容器;关联容器是不行的。

你是否关心容器中的元素是如何排序的?

如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。

你选择的容器必须是标准C++的一部分吗?

如果必须是,就排除了哈希容器、slist和rope。

你需要哪种类型的迭代器?

如果它们必须是随机访问迭代器,则对容器的选择就被限定为vector、deque和string。或许你也可以考虑rope。如果要求使用双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。

当发生元素的插入或删除 *** 作时,避免移动容器中原来的元素是否很重要?

如果是,就要避免连续内存的容器。

容器中的数据的布局是否需要和C兼容?

如果需要兼容,就只能选择vector容器。

元素的查找速度是否关键的考虑因素?

如果是,就要考虑哈希容器,排序的vector,和标准关联容器 --- 或许这就是优先顺序。

如果容器内部使用了引用计数技术(reference counting),你是否介意?

如果是,就要避免使用string,因为许多string的实现都是用了引用计数。Rope也需要避免,因为权威的rope实现是基于引用计数的。当然,你需要某种表示字符串的方法,可以考虑vector<char>。

对插入和删除 *** 作,你需要事务语义(transactional semantics)吗?也就是说在插入和删除 *** 作失败时,你需要回滚的能力吗?

如果需要,你就要使用基于节点的容器。如果对多个元素的插入 *** 作需要事务语义,则你需要选择list,因为在标准容器中,只有list对多个元素的插入 *** 作提供了事务语义。

你需要使迭代器、指针和引用变为无效的次数最少吗?

如果是这样,就要使用基于节点的容器,因为对这类容器的插入和删除 *** 作从来不会使迭代器、指针和引用变为无效(除非它们指向了一个你正在删除的元素)。而针对连续内存容器的插入和删除 *** 作一般会使指向该容器的迭代器、指针和引用变为无效。

如果序列容器的迭代器是随机访问迭代器类型,而且只要没有删除 *** 作发生,且插入 *** 作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效,这样的容器是否对你有帮助?

这是非常特殊的情况,但如果你面对的情形正是如此,则deque是你所希望的容器。(有意思的是,当插入 *** 作仅在容器末尾发生时,deque的迭代器有可能变为无效。deque是唯一的迭代器可能会变为无效而指针和引用不会变为无效的STL标准容器。)

转自CSDN

以上就是关于C++ STL容器之 map全部的内容,包括:C++ STL容器之 map、c++stl是什么,有什么用、c++ stl的容器的问题,添加函数。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10123789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存