用整型键的对象的map或vector
C++: map or vector for objects keyed by integers?
我将存储一些由不同数字键控的对象。大多数数字没有对象,有些数字有1,有些数字有多个。
std::map<int, std::vector<MyObject>> myObjects;
// or...
std::vector<std::vector<MyObject>> myObjects;
std::vector<MyObject> GetObjectsForNumber( int number )
{
// how best to do this?
if ( -check if there is a vector for the number- )
{
return myObjects[number];
// or...
return myObjects.at(number);
}
else
{
// return empty vector?
}
}
我应该使用映射还是向量,我应该如何实现这个函数?
您正在寻找的可能是multimap,参见http://www.cplusplus.com/reference/stl/multimap/。
但是你应该指出你的目标到底是什么——内存效率,性能?此外,键值的"分布"如何?如果这是一个重要的决定,你应该原型。
注::不要写
std::vector<std::vector<MyObject>> myObjects;
而不是
std::vector<std::vector<MyObject> > myObjects; //note the space between the > >
GCC会将>>解释为操作符>>,否则
这实际上取决于您将使用的整数类型。
如果你可能有一个负整数作为键,map
是一种选择,因为vector
不支持负索引。与此相关的是,如果您不打算使用负键,请考虑使用unsigned int
而不是int
来为元素设置键,以更清楚地表明键可以是负的。
如果您将有大量的小整数作为键,vector
可能是一个很好的选择。基于vector
的方法的内存使用将是内存使用0 (U + n),其中U是最大的键,因为vector
需要有连续的存储。如果U
很小,那么基于vector
的方法可能更好。如果U
很大,那就用map
。
但我认为最好的解决方案是使用新的c++ 0x unordered_map
,它提供了接近vector
的复杂性保证(每个元素的恒定时间查找)和接近map
的内存保证(你只支付你正在使用的元素)。这可以使用Boost的容器实现,或者使用TR1实现,或者(如果您有c++ 0x编译器)使用新的标准库来完成。
听起来很像一个带链的哈希映射的候选,或者一个双哈希。
这里有一个重要的问题:作为键的数字是否均匀分布(例如1,6,2,7,4),那么直接使用数字作为向量中的索引将非常有效(O(1)查找)。如果它们不是均匀分布的(例如0、1、10000、100000),那么你将存储大量的空单元格,并使用大量的内存。
在第二种情况下,使用map会好得多。此外,hash_map的行为几乎与map相同,但在这种情况下它可能更快,因为计算机可以一次查看所有整数(键),而不是简单地通过"这个键比那个键大还是小?"来排列它们。(这是地图的工作原理)- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- Arduino编译器和STL:使用std::vector和std::map
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 在 Oracle12c 中保存 std::map<int, std::vector<int>>
- 将map<pair<int,int>,vector<Object> >添加到BST中,其中对是关键
- map.insert:"Invalid arguments"错误与 pair<enum,vector<*>>
- 快速'group by/count' std::vector<std::u16string> 变成 std::map<u16string, int>
- 为什么我的"choose k from n"算法适用于 std::vector,而不适用于 std::map?
- 如何使用单 for 循环遍历 std::map<string>int 和 std::vector<int>?
- 对于关键字查找,std::vector比std::map快
- 使用 std::transform 将 std::vector<struct{key; val;}> 转换为 std::map<key, val>
- 是否可以为带有 std:string 和 std::vector 的 std::map 重载<<运算符<int>?
- 为什么map的元素不需要复制或移动构造函数,而vector需要?
- STLS STD :: MAP和STD :: vector;在地图中检查对象类型
- Python 数据结构:map<string、vector<int>>
- 如何在 OpenMP 4 中为 std::vector 编写"target data map"?
- 如何通过迭代器将 map<string, int> push_back 到 vector<map<string, int>>?
- 一个vector/map中的函数变量参数
- 访问矢量中的地图:map<string,vector<map<string,矢量<int>> > >
- XML RPC - 如何在C++版本的 XMLRPC-C 库中包装、返回和获取 vector<map<string、string> > 的对象?