【问题标题】:best data structure for byIndex and byName retrievalbyIndex 和 byName 检索的最佳数据结构
【发布时间】:2010-07-23 14:17:16
【问题描述】:

假设您需要实现一个T 项目的容器,它的值可以通过数字索引(这是随机访问)和名称(作为字符串)检索。

在检索、添加和删除项目等常用操作性能方面哪个更好

(此时按索引检索需要通过走图来实现)

std::map<std::string,T> container;

或 (通过索引快速随机访问,但需要通过名称进行检索)

std::vector<std::pair<std::string,T>> container;

或通过提供两个单独的容器 (快速检索,但添加/删除操作较慢)

std::vector<T> byIndexContainer;
std::map<std::string,T> byNameContainer;

或者你可以推荐其他更好的数据结构?

【问题讨论】:

    标签: c++ optimization data-structures stl containers


    【解决方案1】:

    或者您可以使用最棒的 Boost::MultiIndex 容器。

    【讨论】:

      【解决方案2】:

      您使用两个独立容器的示例将是索引的速度,正如您所说的添加/删除速度要慢一些。它结合了最好的整数索引和字符串索引。你总是可以创建你自己的类型,内部有这两个。

      【讨论】:

        【解决方案3】:

        地图访问只是对数时间 - 一切都按内部排序存储。因此,如果您有 10000 个元素,您可能会期望它需要对 std::string::operator

        如果您不希望随机访问以提高速度,但由于某种原因您实际上需要索引,那么一种不太费力的解决方案是保留一个排序的向量,这会在您插入或其他内容时使索引无效。通常,您不能拥有静态索引(删除后相同),因为当您删除某些内容时,您需要通过移动内容来更改索引,或者将该索引称为“无效”,在这种情况下,您的“索引”确实是键,因为第 n 个索引不是第 n 个,并且您不能使用所有索引。在这种情况下,直接使用字符串即可。

        如果你真的需要整数键和字符串键,你可能需要使用你的双容器方法。如果你想要的话,我不久前写了一些东西来维护一个唯一键列表(你可以将它专门用于整数)。不过,它在某处工作,除非您发表评论,否则我不会寻找它。

        【讨论】:

          猜你喜欢
          • 2014-06-10
          • 1970-01-01
          • 2018-02-20
          • 1970-01-01
          • 2015-11-16
          • 2017-09-26
          • 1970-01-01
          • 2011-01-18
          相关资源
          最近更新 更多