2013-03-08 44 views
2

我们拿到的这款地图:逼退了地图容器

std::map <int, int> values; 

将这个功能是相同的一个载体的的push_back功能:

void PushBack(int value) 
{ 
    values[values.size()] = value; 
} 

因为尺寸返回容器的大小我认为这是正确的,根据以下情况它是: 索引0 = 200 索引1 = 150 你想推回100,values.size()会返回2,对不对?那么,它就像正常的push_back进入索引2一样,是否正确?

+1

'values [values.size()]'会给你一个运行时错误,因为你正在添加一个** **过去**容器的末尾。 – 2013-03-08 13:56:40

+0

如果您想要顺序存储使用矢量。将地图用作矢量没有任何优势。 – andre 2013-03-08 13:57:44

+1

@ bash.d不,''values'是一张地图。其运算符'[]'如果该键不存在则创建一个条目。 – Angew 2013-03-08 13:57:57

回答

7

地图的要点是根据唯一表示数据的关键字来查找和存储数据。

如果你这样做,使用地图没有意义;你应该选择另一个更适合应用程序设计需求的数据结构。

+1

+1,'std :: vector'和'std :: map'存在不同的目的,在它们有意义的地方使用它们。 – 2013-03-08 13:57:52

1

除非您仅以非常特殊的方式使用地图,否则它将不正确。考虑这种情况:

values现在拥有一个元素,7,在指数1

问题是,当然,如果你需要“推回”,为什么首先使用地图。

0

如果你想要push_back然后考虑使用std::vector。一个map是一个关联数组,可以通过指定类型的键快速查找。它们不是设计成像vector一样做push_back。

0

很难说你想实现什么,以及为什么你尝试使用地图,而不是载体,但更好的方法可能是:

void PushBack(int value) 
{ 
    int idx = 0; 
    if(values.size()) idx = values.rbegin()->first + 1; 
    values[idx] = value; 
} 
2

地图和矢量有很大的不同。

短版到你问的实际问题:

,如果你自定义的地图上做的是已经存在的密钥的基于密钥的查找(运营商[])和您的push_back可能像一个效率低下的替代矢量,你只使用向量运算符[]和push_back,是的。

长版本提供,为什么你在做什么,一些背景可能不是真正你想要什么:

的地图没有一个指标,它有一个关键。地图通常以红黑树的形式实现。这样的数据结构允许基于密钥进行有效的查找。您通常关心某个特定元素的关键,而关键本身则包含重要信息。密钥通常不是连续的,并且地图不会为映射中未使用的密钥分配空间。

一个向量是一个连续的内存块。这允许有效的索引访问。索引与键不同:您通常不关心某个特定元素获得哪个索引,您获得的索引取决于插入顺序(它们的键值与地图中的插入顺序无关),索引到矢量中始终是整数值,并且不能有非连续的索引。

如果您在映射中所做的所有操作都是您自己的自定义push_back,那么在外部它可能在某些情况下看起来像一个向量,并且在其他情况下(例如迭代器失效)可能不会如此。

由于您实际上并不关心在您的示例中添加的元素的关键点,所以地图的选择毫无意义。向量中的索引查找速度会更快,并且内存开销会更小(尽管如果分配了很多对象,最终会导致内存碎片问题,但这是一个单独的主题)。

最后,如果您不知道要使用哪个容器类,则需要使用向量和列表。理解这两者之间的差异,以及何时应该使用它们中的任何一个,然后转向更高级的专用容器,如map,set,它们的“多个”变体以及它们的“无序”变体。

+0

+1 - 非常详细的答案:) – 2013-03-08 14:50:22