c - 如何在不使用 C++ STL 的情况下实现 C 中的 map 概念

标签 c dictionary stl

<分区>

在 C++ 中,map 用于指向相对于键的值。

如何使用 C++ STL 概念在 C 编程语言中实现相同的功能

最佳答案

您真正需要做的就是定义一个至少包含键和值成员的结构,然后定义一个可以容纳多个该结构的容器。容器只需要支持三种基本操作:Insert、Remove 和 Find。

几乎所有类型的 data structure会做,但在易于实现和效率之间进行不同的权衡。一些最可能的选择是:

  • 数组或链表:如果您知道永远不会有大量数据并且效率不是真正的问题,那么您可以简单一些。查找操作可以只是一个简单的线性搜索。

  • 排序数组:您还可以选择在每次插入或删除条目时保持简单数组排序。这让 Find 算法可以使用二进制搜索,如果 Find 比 Insert 或 Remove 更频繁地需要,这可能是合适的。

  • A red-black tree :如果你想要C++的std::map为大数据集提供的O(log N) Insert/Remove/Find效率性能,红黑树是一个不错的选择。这也保证了元素按键排序,如果您需要处理数据的子范围,这很有用。

  • A hash table :C++11引入了std::unordered_map,如果你能为你的键类型找到或产生一个哈希函数,你可以通过实现一个哈希表在C中模仿它。此数据结构具有 O(1) 平均情况插入/删除/查找,但 O(N) 最坏情况插入/删除/查找。条目未排序。

实现红黑树或哈希表可能有点棘手,但您可以找到并使用许多免费的实现。

关于c - 如何在不使用 C++ STL 的情况下实现 C 中的 map 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50927929/

相关文章:

javascript - 尝试创建一个给定 2 个数组 + 映射的对象数组

c# - Dictionary.ContainsKey 行为不端 c#

c++ - 比较来自不同容器的迭代器

objective-c - 如何在循环中动态构建这样的 C 数组,返回它并保留引用?

c - 输出 a = ~a + 2 << 1 ;

c - scanf 验证坐下来等待另一个输入。为什么?

python - 为指向 ctypes 结构的指针释放内存时出错?

Python按键删除列表中的字典

C++ 需要线程安全的经过良好测试的容器(非微软)

c++ - C++ STL 中关于 bind1st with men_fun 的老问题