为地图容器推回
push back for the map container
我们得到了这张地图:
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;
}
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 修改地图内矢量中的值
- 为什么我在地图中搜索STL时差很大?
- 我正在尝试按降序对地图进行排序,但没有得到预期的结果?
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?