std::set 和 std::map 有什么区别
What is the difference between std::set and std::map
我对 c++ 编程相对较新,想知道是否有人可以帮助我澄清几个问题。
http://www.cplusplus.com/reference/set/set/
http://www.cplusplus.com/reference/map/map/
我一直在阅读如何实现 STL 二叉搜索树,我一直注意到 std::set 和 std::map 经常被提及为完成此类任务的方法。然而,两者之间究竟有什么区别?对我来说,两者看起来几乎相同,我不确定是否有一些我没有注意到的东西使一个在特定任务中比另一个更好。使用 std::set 而不是 std::map 来实现从数组或向量中获取值的 STL 二叉搜索树(例如速度)有什么优势吗?
如果有人能帮助我理解这个概念,我将不胜感激!
std::set
和std::map
都是associative containers
。不同之处在于std::sets
只包含密钥,
而在std::map
中有一个关联的值,即如果A -> B
,则map[A]=B,这类似于hashing
但不是O(1)
,而是O(log N)
。
您可以进一步查看unordered_map在O(1)
时间内提供操作。
std::set
将数据保持排序格式。
两者的实现都是由平衡树(如AVL或红黑树)完成的,O(logN)
时间复杂度。
但需要注意的重要一点是 两者都可以存储唯一值 .要克服这一点,您还必须看到 多映射 和 多集 .
希望这有帮助!
更新:在红黑树的情况下,重新平衡旋转是一个O(1)
操作,而对于AVL,这是一个O(log n)
操作,使红黑树在重新平衡阶段的这一方面更有效率,也是它更常用的可能原因之一。
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- "using namespace std;"在C++的作用是什么?
- 传递给std::function template的template参数究竟代表什么
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 什么是 std::exception::what() 以及为什么要使用它?
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 什么是自动 t1=std::make_tuple(case1==case2,整数)的值
- C++std::atomic在程序员级别保证了什么
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在 C# 中等效的 std::rotate() 是什么?
- 什么是 std::function::argument_type 的替代品?
- 什么是 std::jthread 在 c++20 中?
- std::enable_if 和 std::enable_if_t 有什么区别?
- "owned pointer"和 std::shared_ptr 的"stored pointer"有什么区别?