std::map 接口
时间: 2023-11-09 08:56:54 浏览: 57
std::map是C++标准库中的一个关联容器,它提供了一种键值对的映射关系。下面是std::map的一些接口:
1. 插入元素:
- 使用`insert`函数插入键值对。
- 使用`emplace`函数在插入的同时进行构造。
- 使用方括号运算符`[]`插入元素,如果键不存在则创建新的键值对。
2. 删除元素:
- 使用`erase`函数删除指定的键值对。
- 使用`clear`函数删除所有的键值对。
3. 访问元素:
- 使用方括号运算符`[]`访问元素,如果键不存在则会创建新的键值对。
- 使用`at`函数访问元素,如果键不存在则抛出异常。
- 使用`find`函数查找指定键的迭代器。
- 使用`count`函数统计指定键出现的次数。
4. 迭代器操作:
- 使用`begin`和`end`函数获取迭代器的起始和终止位置。
- 使用迭代器进行遍历和访问元素。
5. 容量操作:
- 使用`size`函数获取map中键值对的个数。
- 使用`empty`函数判断map是否为空。
相关问题
std::map 技巧
引用提到了一种优化技巧,即通过禁用同步来比较 C++ 的输入输出速度。这个技巧可以通过使用一个 lambda 表达式来实现。在 lambda 表达式中,调用 `std::ios::sync_with_stdio(false)` 来禁用同步,同时使用 `cin.tie(nullptr)` 和 `cout.tie(nullptr)` 来解绑输入和输出流。这样可以提高输入输出的效率。
引用中提到了 std::pair 的定义和实现。std::pair 是一个模板化的 struct,成员变量默认是公有类型。std::map 使用红黑树来实现,而 std::pair 在 std::map 中被用作键值对。map 的键不能被修改,但值可以被修改。std::map 封装了红黑树的接口,底层的操作都是借助于红黑树的特性来实现的。
引用中提到了 std::map 的实现中使用了空基类优化(empty base class optimization)。具体做法是,std::map 内部使用 rb_tree 作为成员变量,rb_tree 内部使用 rb_tree_impl 作为成员变量,而 rb_tree_impl 继承自 allocator。如果 allocator 是空类,那么 rb_tree_impl 的大小就和没有基类时一样。其他的 STL 容器也使用了相同的优化措施,比如 std::vector 对象是 3 个字长,std::list 对象是 2 个字长。boost 的 compressed_pair 也使用了相同的优化。
综上所述,std::map 是一个使用红黑树实现的关联容器,它使用 std::pair 作为键值对。同时,在实现中使用了空基类优化来减小对象的大小。
std::map std::set
std::map和std::set是常用的关联式容器,它们都是ADT(抽象数据类型)。它们的接口不仅规定了操作的功能,还规定了操作的复杂度。例如,std::map的insert函数在通常情况下的复杂度是O(logN),其中N是元素的数量。但是如果插入的元素已经按照键值排序,那么复杂度将会是O(1)。\[1\]
在实现中,为了节约std::map和std::set对象的大小,STL使用了空基类优化。具体做法是将rb_tree作为成员变量,而rb_tree又以rb_tree_impl为成员变量,rb_tree_impl继承自allocator。如果allocator是空类,那么rb_tree_impl的大小就和没有基类时一样。其他STL容器也使用了相同的优化措施,因此std::vector对象占用3个字长,std::list对象占用2个字长。boost的compressed_pair也使用了相同的优化。\[2\]
对于传递参数的方式,根据《Effective C++》的建议,我们应该尽量使用const引用来传递对象。但是对于内置类型、STL迭代器和STL仿函数,传值也是可以的,一般不会有性能损失。\[3\]
#### 引用[.reference_title]
- *1* *2* *3* [关于 std::set/std::map 的几个为什么](https://blog.csdn.net/Solstice/article/details/8521946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]