代码之家  ›  专栏  ›  技术社区  ›  Tom Savage

通过同一个操作员访问和分配集装箱?

  •  2
  • Tom Savage  · 技术社区  · 15 年前

    我已经创建了一个通用的、弱类型数据的容器,可以通过下标操作符访问它。

    这个 std::map 容器允许通过运算符进行数据访问和元素插入,而 std::vector 我想没有。

    什么是最好的(C++风格)进行的方式?我应该允许通过下标运算符进行分配还是使用单独的insert方法?

    编辑

    我应该说,我不是问我是否应该使用向量或映射,我只是想知道人们对访问和插入以这种方式组合的看法。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Viktor Sehr    15 年前

    当然是单独插入法。这个 operator[] std::map 只是很愚蠢,使代码难以读取和调试。 此外,如果使用 操作员[ ] 插入(将导致 联合国癌症 更邪恶的表亲 癌灶 )

        2
  •  2
  •   Hassan Syed    15 年前

    在向量的情况下:下标符号不会插入——它会覆盖。

    这篇文章的其余部分将信息从 Effective STL .

    如果你在手之前就知道数据的范围——而且大小是固定的——而且你不会在上面有数据的地方插入——那么你可以使用插入向量而不会产生不愉快的副作用。

    但是,在一般情况下,向量插入会产生一些影响,例如,当您在 自组织网络 插入。向量是为您知道数据的位置特征而设计的。

    向量带有插入成员函数…这个函数对于大多数实现都非常聪明,因为它可以从迭代器中推断出优化。你就不能用这个吗?

    如果要执行数据的特殊插入,则应使用列表。也许您可以使用一个列表来收集数据,然后在数据最终确定后,使用基于范围的插入或基于范围的构造函数填充一个向量?

        3
  •  1
  •   Goz    15 年前

    这取决于你想要什么。如果您希望使用类似数组的东西,映射可能比向量慢得多。如果要使用的索引不是连续的,并且您有很多索引,那么映射非常有用。通常只需使用一个向量,对其进行排序并进行二进制搜索就可以更快地找到所需的内容。我用这种方法来替换成吨级的软件中的地图,但我仍然没有找到用向量来做这项工作更慢的地方。

    所以,imo,std::vector是更好的方法,不过如果您正确地使用它,映射可能会很有用。