c++ - 映射逻辑上相似的抽象类的键

标签 c++ dictionary

假设用户使用带有 kBase vBase 类的库。用户添加对他可用的类的键和值对(他使用库实现它们)- vk。在库中,添加后,我希望将逻辑上相似(具有相同字符串)的键“合并”为一个键。

他是我尝试过的代码示例:

//---------------------------LIBRARY.h------------------------//

#include <map>
#include <vector>
#include <iostream>

using namespace std;   

map<kBase*,vector<vBase*>> mapa;

void printMap();
void addToMap(kBase* k1, vBase* v2);

class kBase {
public:
    virtual ~kBase(){}
};

class vBase {
public:
    virtual ~vBase(){}
};

//---------------------------LIBRARY.cpp------------------------//

void printMap()
{
    // Expect 3 keys to be implemented.
    for (auto i : mapa)
        cout << i.first << endl;
}

void addToMap(kBase* k1, vBase* v2)
{
    // Create a k1. if it doesnt exist - vector will be created.
    // Otherwise, the object will be obtained.
    mapa[k1];
    mapa[k1].push_back(v2);
}

//------------------------USER----------------------------//

#include "LIBRARY.h"

// User's implementation.
class k : public kBase {
public:
    k(string inputString)
    {
        kString = inputString;
    }
    ~k(){}

    string kString;
};

class v : public vBase {
public:

    v(string inputString)
    {
        vString = inputString;
    }
    ~v(){}

    string vString;
};

int main()
{
    // User adds keys and values
    addToMap(new k("key1"), new v("value1"));
    addToMap(new k("key1"), new v("value2"));
    addToMap(new k("key1"), new v("value3"));

    addToMap(new k("key2"), new v("value4"));
    addToMap(new k("key2"), new v("value5"));
    addToMap(new k("key2"), new v("value6"));

    addToMap(new k("key3"), new v("value7"));
    addToMap(new k("key3"), new v("value8"));
    addToMap(new k("key3"), new v("value9"));

    printMap();

    return 0;
}

显然,我不能直接将基类添加为键。并且库不知道用户实现的类(从库的类继承)。但同样,图书馆如何知道给定的对象在逻辑上是否相似。

我应该为此目的使用不同的数据结构吗?

最佳答案

C++ map 使用等价概念来查找条目,这是通过“较少”比较定义的。如果 k1“不小于”k2k2“不小于”k1,则两个键 k1 和 k2 被认为是等价的。因此,您只需定义用于比较指向 kBase 类的指针的仿函数。

class kBaseLessCompare
{
public:
    bool operator() (const kBase * k1, const kBase * k2)
    {
        // something like the following, but you shall define your comparison
        return k1->name < k2->name;
    }
}

然后将您的 map 定义更改为以下内容:

map<const kBase*, vector<vBase*>, kBaseLessComapre> mapa;

关于c++ - 映射逻辑上相似的抽象类的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36835416/

相关文章:

c++ - 添加 boost/asio 时未定义对 `boost::system::generic_category()' 的引用

c++ - openCV java 代码将 Point 对象传递给 native 代码(C++)?

c++ - 当大小仅在运行时已知时如何指定 C++ 静态 vector 大小-不需要

时间:2019-03-17 标签:c++boosticlcontainersinsharedmemory

c++ - 多线程。如何平等共享公共(public)资源?

swift - 功能和选项练习

python - Pydot 中决策树的字典对象

python - 确定每天的员工级别

list - 根据位置从列表中删除多个元素

android - createRoute 方法是否支持 Mapquest 中的纬度/经度?