无法遍历无序映射中的溢出

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 的文档才能正确使用它。映射是键(索引键)和值(存储的数据)之间的关系。在这种情况下,您只使用两个键(即 01)并且您对地图所做的每个 insert() 只是 拒绝在已经存在的两个键上插入元素包含新数据的单元格。预期的行为是你得到的(你只使用两个不同的键,你只有两个包含数据的单元格),你插入的第一个条目只有你使用的两个键,每个。 Multimap classes 允许您使用相同的键 多个条目 ,因此您将正确插入所有元素。

但另一个问题是,如果您不使用 map 提供的功能,为什么还要使用它。该地图允许您按键区分元素,因此通常情况下,您不会插入(可能仅在无法按键区分元素的多重映射中),而是 put() 元素并按键索引它们(使用 []运算符)?

请仔细阅读有关每个 class 的文档。