推回地图容器

时间:2013-03-08 13:54:08

标签: c++ map vector containers push-back

我们得到了这张地图:

std::map <int, int> values;

此函数是否与Vector的push_back函数相同:

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

因为size返回容器的大小,我认为它是正确的,根据以下场景,它是: index 0 = 200 指数1 = 150 你想推回100,values.size()会返回2,对吧?那么,就像正常的push_back进入索引2一样,是吗?

5 个答案:

答案 0 :(得分:8)

地图的重点是根据唯一表示该数据的密钥查找和存储数据。

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

答案 1 :(得分:2)

地图和矢量非常不同。

您提出的实际问题的简短版本:

如果您在自定义地图上执行的操作是对现有密钥(运算符[])和push_back进行基于密钥的查找,则它可能就像向量的低效插入式替换,您只使用向量运算符[]和push_back,是的。

长版本提供了一些关于你为什么做的背景可能实际上并不是你想要的:

地图没有索引,它有。地图通常实现为红黑树。这种数据结构允许基于密钥的有效查找。您通常关心特定元素的关键,关键本身带有重要信息。键通常不是连续的,并且映射不会为映射中未使用的键分配空间。

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

如果您在地图中执行的操作都是您自己的自定义push_back,那么在某些上下文中它可能看起来像一个向量,并且在其他上下文中可能不会(例如迭代器失效)。

由于您实际上并不关心在示例中添加的元素的键,因此选择映射是没有意义的。向量中的索引查找将更快,并且内存开销将更小(尽管如果分配了很多对象,但最终会出现内存碎片问题,但这是一个单独的主题)。

最后,如果你不知道要使用哪个容器类,那么vector和list就是要开始的地方。理解这两者之间的差异,以及何时应该使用它们中的任何一个,然后转到更高级的专用容器,如map,set,它们的“多”变体,以及它们的“无序”变体。

答案 2 :(得分:1)

除非你只以非常特殊的方式使用地图,否则它将是不正确的。请考虑以下情况:

std::map<int, int> values;

values[1] = 42;
PushBack(7);

values现在只包含一个元素7,位于索引1

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

答案 3 :(得分:0)

如果您需要push_back,请考虑使用std::vector。 map是一个关联数组,用于通过指定类型的键快速查找。它们的设计并不像矢量那样做push_back。

答案 4 :(得分:0)

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

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