用预定义的大小在C++中实现Map

Implement Map in C++ with a predefined size

本文关键字:C++ 实现 Map 预定义      更新时间:2023-10-16

我想用C++实现我自己版本的映射数据结构。我需要预先定义它的大小,所以我决定当用户创建地图时,他不仅要指定大小,还要指定键和值的默认值。在你问之前-我需要这个,以便能够在嵌入式系统中使用该数据结构。

我已经写了这个构造函数:

template <typename T, typename K>
myMap<T, K>::myMap(int size, const T& keyInit, const K& valueInit) :
size(nSize), defaultKey(keyInit), defaultValue(valueInit)
{
    for (int i = 0; i < nSize; i++)
    {
        container.insert(std::make_pair(keyInit,valueInit));
    }
}

其中container是类型为std::map<T, K>的成员(基本上该类只是stl映射的包装器)

现在我不知道如何实现insert函数。除此之外,我还弄清楚了如何删除(重新设置默认值)和如何搜索(使用stl的maps-find)。所以我现在唯一的问题是insert方法。

我想过在地图上迭代,寻找第一个空闲的单元格,但这让我很困惑,我被卡住了。任何其他想法都很好。

如果我理解得很好,您可以为标准容器(即映射)制作一个包装器。

在构造时,您打算插入几个相同的默认关键点。这在std::map中是不允许的,其中密钥必须是唯一的。

如果你想在地图中多次使用同一个关键点,你必须使用multimap:你几乎可以把它用作地图,但它允许有重复的关键点。

我不知道为什么要用默认键创建项目,但必须注意映射和多映射使用有序键。因此,如果您以后打算用另一个替换默认键,则不能只替换值:您必须删除条目并插入一个新条目。

std::map中的键是唯一的,因此您在构造时所做的操作没有意义。

如果您希望获得出色的性能(在嵌入式世界中可能就是这样),那么我建议您寻找其他哈希表实现。您还可以实现自己的哈希表来满足您的需求。

对于嵌入式系统,我认为实际上想要的是自定义内存分配器。您可以为要使用的每个数据结构定义一个分配池。然后将它传递给映射的构造函数,它将从池中分配数据。当池为空时,它将发送bad_alloc异常。