自动为C 的地图生成密钥

  • 本文关键字:密钥 地图 c++ hashmap maps
  • 更新时间 :
  • 英文 :


我有一个可以创建对象的类,并将它们存储在用整数密钥的地图中因此,如果用户创建一个新对象,则默认的第一个密钥为100,然后用户决定制作更多,则它会增加1(即101、102等(。我将如何自动化此过程?

例如,假设类正在创建包含教室名称的字符串对象的向量。

std::map<int, vector<string>> classrooms;

因此,当用户创建一个实例时,第一个将由整数密钥100访问,但是如果用户想添加更多信息,我将如何使其增加1。(假设int main在段循环中运行,允许交互式命令继续创建更多的教室(

您可以拥有一个带有过载operator ()的键发电机类,以通过每个调用来生成键的增量唯一键,例如:

#include <map>
class keyGen
{
public:
    keyGen(int x): key(x) {}
    int operator()(int x = 1)  { 
        return (key += x);
    }
private:
    int key;
};
class someClass
{
private:
    std::map<int, std::string> dataMap;
    keyGen kg;
public:
    someClass(): kg(0) {};
    void createFoo(std::string foo)
    {
        dataMap.insert(std::pair<int, std::string>(kg(), foo));
    }
    void createBar(std::string bar)
    {
        dataMap.insert(std::pair<int, std::string>(kg(), bar));
    }
};
int main()
{
    someClass sc;
    sc.createFoo("foo"); //sc::dataMap == [1, "foo"]
    sc.createBar("bar"); //sc::dataMap == [2, "bar"]
    return 0;
}

您说您要存储对象并将它们存储在地图中,但是您的示例具有字符串向量的映射,因此要使用该示例,您可以编写一个容器教室和地图:

struct classroom_collection {
        typedef std::vector<std::string>> classroom_type;
        classroom_type& create_classroom();
        //... more ... eg get_class_room(size_t index);
    private:
        std::map<size_t,classroom_t> classrooms;
};

create_classroom将创建classroom,将其添加到地图中,然后返回对其的引用。更通用的情况看起来像这样:

template <typename T>
struct X_collection {
        X& create_X();
    private:
        std::map<size_t,X> data;
};

,如果classroom是您的自定义类(不仅是字符串的向量(,它应该具有私人构造函数并成为该集合的朋友,以便创建classroom的唯一方法是通过classroom_collection

最新更新