3

我们得到了这张地图:

std::map <int, int> values;

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

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

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

4

5 回答 5

6

The whole point of maps is to lookup and store data based on a key that uniquely represents that data.

If you're doing this there's no point in using a map; you should choose another data structure that more appropriately addresses the design needs of the application.

于 2013-03-08T13:56:49.050 回答
2

地图和矢量非常不同。

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

如果您在自定义地图上所做的只是基于键查找已经存在的键(运算符 [])和您的 push_back,那么它可能就像只使用矢量运算符 [] 和 push_back 的矢量的低效替代品,是的。

提供一些背景的长版本可能不是您真正想要的:

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

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

如果您在地图中所做的只是您自己的自定义 push_back,那么在某些情况下它可能看起来像一个向量,而在其他情况下它可能不会以其他方式(例如迭代器失效)。

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

最后,如果您不知道要使用哪个容器类,则可以从 vector 和 list 开始。了解这两者之间的区别,以及何时应该使用它们中的任何一个,然后继续使用更高级、更专业的容器,例如 map、set、它们的“multi”变体和“unordered”变体。

于 2013-03-08T14:11:04.837 回答
1

Unless you only use the map in a very special way, it won't be correct. Consider this scenario:

std::map<int, int> values;

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

values now holds just one element, 7, at index 1.

The question is, of course, if you need 'push back', why use a map in the first place.

于 2013-03-08T13:55:51.933 回答
0

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

于 2013-03-08T13:57:58.957 回答
0

很难说你想要达到什么,以及为什么你尝试使用地图而不是矢量,但更好的方法可能是:

void PushBack(int value)
{
   int idx = 0;
   if( values.size() ) idx = values.rbegin()->first + 1;
   values[idx] = value;
}
于 2013-03-08T14:02:50.507 回答