无法遍历无序映射中的溢出
Cant interate through overflow in an unorderd map
据我所知,boost:unordered_map 和 std::unordered_map 在 "overflow" 方面的工作方式相同(也就是使用相同的键插入的多个内容)。他们将其存储在 "bucket" 中,这样您就可以对其进行迭代。
例如:
key: data:
"apple" 2
"peach" 4
"apple" 3
"peach" 8
那么 "apple" 的存储桶将包含 2 和 3,对吗?
嗯,我在访问这些东西时遇到了问题。
这是我的代码:
#define ANZ 10
typedef boost::unordered_map<uint16_t, int> uuidMap_int;
using namespace std;
int main()
{
uuidMap_int uuidMap;
boost::uuids::uuid entity1;
boost::uuids::uuid entity2;
for(unsigned int i = 0;i<ANZ;i++)
uuidMap.insert(std::pair<int,int>((i<5?0:1),i));
for(unsigned int i = 0;i < uuidMap.bucket_count();i++){
for(uuidMap_int::local_iterator it = uuidMap.begin(i); it != uuidMap.end(i);++it){
std::cout<<it->first<<"|"<<it->second<<"\n";
}
}
return 0;
}
它所做的只是在地图上创建 2 个新条目并填充它们。
输出应该是这样的:
0|0
0|1
0|2
.
.
.
1|5
1|6
.
.
.
1|10
但实际上是这样的
0|0
1|5
现在我不知道为什么会这样。 "overflow" 似乎只是被丢弃了。然而,我正在尝试使某事类似于一个小型数据库,所以我需要一种方法来在这样的地图中拥有一个 id 和一堆属于所述 id 的数据。
我在做什么wrong/what其他地图允许我按照我想要的方式工作?
问题(以及@juanchopanza 试图展示的内容)是您必须阅读有关 class 的文档才能正确使用它。映射是键(索引键)和值(存储的数据)之间的关系。在这种情况下,您只使用两个键(即 0
和 1
)并且您对地图所做的每个 insert()
只是 拒绝在已经存在的两个键上插入元素包含新数据的单元格。预期的行为是你得到的(你只使用两个不同的键,你只有两个包含数据的单元格),你插入的第一个条目只有你使用的两个键,每个。 Multimap
classes 允许您使用相同的键 多个条目 ,因此您将正确插入所有元素。
但另一个问题是,如果您不使用 map
提供的功能,为什么还要使用它。该地图允许您按键区分元素,因此通常情况下,您不会插入(可能仅在无法按键区分元素的多重映射中),而是 put()
元素并按键索引它们(使用 []
运算符)?
请仔细阅读有关每个 class 的文档。
据我所知,boost:unordered_map 和 std::unordered_map 在 "overflow" 方面的工作方式相同(也就是使用相同的键插入的多个内容)。他们将其存储在 "bucket" 中,这样您就可以对其进行迭代。
例如:
key: data:
"apple" 2
"peach" 4
"apple" 3
"peach" 8
那么 "apple" 的存储桶将包含 2 和 3,对吗?
嗯,我在访问这些东西时遇到了问题。
这是我的代码:
#define ANZ 10
typedef boost::unordered_map<uint16_t, int> uuidMap_int;
using namespace std;
int main()
{
uuidMap_int uuidMap;
boost::uuids::uuid entity1;
boost::uuids::uuid entity2;
for(unsigned int i = 0;i<ANZ;i++)
uuidMap.insert(std::pair<int,int>((i<5?0:1),i));
for(unsigned int i = 0;i < uuidMap.bucket_count();i++){
for(uuidMap_int::local_iterator it = uuidMap.begin(i); it != uuidMap.end(i);++it){
std::cout<<it->first<<"|"<<it->second<<"\n";
}
}
return 0;
}
它所做的只是在地图上创建 2 个新条目并填充它们。 输出应该是这样的:
0|0
0|1
0|2
.
.
.
1|5
1|6
.
.
.
1|10
但实际上是这样的
0|0
1|5
现在我不知道为什么会这样。 "overflow" 似乎只是被丢弃了。然而,我正在尝试使某事类似于一个小型数据库,所以我需要一种方法来在这样的地图中拥有一个 id 和一堆属于所述 id 的数据。
我在做什么wrong/what其他地图允许我按照我想要的方式工作?
问题(以及@juanchopanza 试图展示的内容)是您必须阅读有关 class 的文档才能正确使用它。映射是键(索引键)和值(存储的数据)之间的关系。在这种情况下,您只使用两个键(即 0
和 1
)并且您对地图所做的每个 insert()
只是 拒绝在已经存在的两个键上插入元素包含新数据的单元格。预期的行为是你得到的(你只使用两个不同的键,你只有两个包含数据的单元格),你插入的第一个条目只有你使用的两个键,每个。 Multimap
classes 允许您使用相同的键 多个条目 ,因此您将正确插入所有元素。
但另一个问题是,如果您不使用 map
提供的功能,为什么还要使用它。该地图允许您按键区分元素,因此通常情况下,您不会插入(可能仅在无法按键区分元素的多重映射中),而是 put()
元素并按键索引它们(使用 []
运算符)?
请仔细阅读有关每个 class 的文档。