【问题标题】:Dynamic array width id?动态数组宽度ID?
【发布时间】:2011-10-14 08:51:17
【问题描述】:

我需要某种 C++ 中的动态数组,其中每个元素都有自己的 id,由 int 表示。

数据类型需要这些函数:

  • int Insert() - 返回 ID
  • 删除(整数 ID)
  • Get(ID) - 返回元素

我应该使用什么数据类型?我查看了 Vector 和 List,但似乎找不到任何类型的 ID。另外,我查看了 map 和 hastable,这些可能有用。但是,我不确定该选择什么。

【问题讨论】:

  • 您可以使用该元素的迭代器作为 id 吗?
  • 如果我删除数组中间的一个元素,如果我使用迭代器,id不会改变吗?

标签: c++ vector hashtable dynamic-arrays


【解决方案1】:

我可能会使用向量和空闲 id 列表来处理删除,那么索引就是 id。这非常快插入和获取并且相当容易管理(唯一的技巧是删除项目的空闲列表)。

否则,您可能想使用地图并只跟踪未使用的最低 id 并在插入时分配它。

【讨论】:

    【解决方案2】:

    std::map 可以为您工作,它允许将键关联到值。 key 将是您的 ID,但您应该在向地图添加元素时自己提供它。

    哈希表是一种可用于实现无序映射的基本机制。它对应于 std::unordered_map。

    【讨论】:

      【解决方案3】:

      似乎最好使用的容器是 unordered_map。 它基于哈希。您可以在 O(n) 中插入、删除或搜索元素。

      目前 unordered_map 不在 STL 中。如果您想使用 STL 容器,请使用 std::map。 它基于树。在 O(n*log(n)) 中插入、删除和搜索元素。

      容器的选择仍然很大程度上取决于使用强度。例如,如果您发现元素稀有,则向量和列表可能没问题。这些容器没有 find 方法,但<algorithm> library 包含它。

      【讨论】:

        【解决方案4】:

        vector 提供恒定时间随机访问,“id”可以简单地作为向量的偏移量(索引)。 deque 类似,但不会连续存储所有项目。

        如果 ID 值可以从 0 开始(或从 0 开始的已知偏移量并单调递增),则这两种方法都是合适的。随着时间的推移,如果有大量删除,vectordeque 可能会变得稀疏,这可能是有害的。

        std::map 不存在人口稀少的问题,但查找从恒定时间变为对数时间,这可能会影响性能。

        boost::unordered_map 可能是目前最好的,因为在给定问题的情况下,作为哈希表的最佳情况可能具有最佳的整体性能特征。但是,可能需要使用 boost 库——但如果在您的 STL 实现中可用,std::tr1 中也有 unordered 容器类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-22
          • 1970-01-01
          • 1970-01-01
          • 2015-01-27
          • 1970-01-01
          • 2013-05-24
          • 2013-07-25
          相关资源
          最近更新 更多