为地图容器推回

push back for the map container

本文关键字:地图      更新时间:2023-10-16

我们得到了这张地图:

std::map <int, int> values;

这个函数是否与Vector的push_back函数相同?

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

由于size返回容器的大小,我认为这将是正确的,根据以下场景,它是:指数0 = 200指数1 = 150你想要推回100,values。size()会返回2,对吧?然后,它会像普通的push_back一样进入索引2,对吧?

映射的全部意义在于根据唯一表示该数据的键查找和存储数据。

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

地图和矢量是非常不同的。

你问的实际问题的简短版本:

如果你在你的自定义映射上所做的一切都是基于键的查找已经存在的键(操作符[])和你的push_back,它可能像一个低效的替代向量,你只使用向量操作符[]和push_back,是的。

长版本提供了一些背景信息,说明为什么你正在做的事情可能不是你真正想要的:

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

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

如果你在map中所做的只是你自己的自定义push_back,那么在外部,它可能在某些上下文中看起来像vector,而在其他上下文中可能不是(例如迭代器失效)。

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

最后,如果不知道使用哪个容器类,可以从vector和list入手。了解这两者之间的区别,以及何时应该使用它们中的任何一个,然后转向更高级的、专门的容器,如map、set、它们的"多"变体和它们的"无序"变体。

除非您仅以非常特殊的方式使用该映射,否则它将不正确。考虑这个场景:

std::map<int, int> values;
values[1] = 42;
PushBack(7);

values现在在索引1处只保存一个元素7

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

如果需要push_back,则考虑使用std::vector。map是一个关联数组,用于根据指定类型的键进行快速查找。它们不像vector那样设计为push_back。

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

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