通过同一个运营商访问和分配容器?

时间:2010-02-01 14:29:25

标签: c++ containers

我为通用的弱类型数据创建了一个容器,可以通过下标运算符访问。

std::map容器允许通过运算符进行数据访问和元素插入,而我认为std::vector不允许。

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

修改

我应该说,我不是在问我是不是应该使用矢量或地图,我只是想知道人们在访问和插入方面的想法是这样的。

3 个答案:

答案 0 :(得分:2)

对于Vectors:下标表示法不插入 - 它会覆盖。

本文的其余部分提炼了Effective STL项目1-5中的信息。

如果您事先知道数据的范围 - 并且大小是固定的 - 并且您不会在具有高于它的数据的位置插入 - 那么您可以使用插入到矢量而没有令人不快的副作用。

然而,在一般情况下,当你使 ad hoc <时,向量插入会产生影响,例如向上移动成员并在耗尽时将内存加倍(这会导致从旧向量的对象到新向量中的位置的大量复制) / em>插入。向量是为了解数据的位置特征而设计的。

向量带有一个插入成员函数......对于大多数实现来说,这个函数非常聪明,因为它可以推断出来自迭代器的优化。你能用这个吗?

如果要进行临时插入数据,则应使用列表。也许您可以使用列表来收集数据,然后一旦最终使用基于范围的插入或基于范围的构造函数填充向量?

答案 1 :(得分:1)

这取决于你想要什么。如果您希望使用类似于数组的东西,则地图可能比矢量慢得多。如果要使用的索引是非顺序的并且您有它们的LOADS,则映射非常有用。它通常可以更快地使用矢量,对其进行排序并进行二分查找以找到您所追求的内容。我已经用这种方法替换了大量软件中的地图,但我仍然没有找到用矢量来做这件事的速度较慢的东西。

所以,IMO,std :: vector是更好的方法,尽管如果你正确使用它,地图可能会很有用。

答案 2 :(得分:0)

单独插入方法,绝对。 operator[] std::map只是愚蠢的,使代码难以阅读和调试。 如果您使用operator[]进行插入(这将导致 un-const-cancer ,甚至是更邪恶的表兄弟,您也无法访问const上下文中的数据EM>常量癌症)。