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

map keys of abstract classes that are logically similar

本文关键字:抽象类 相似 逻辑上 映射      更新时间:2023-10-16

假设用户使用具有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++映射使用等价概念来查找条目,这是通过"更少"比较定义的。如果 k1 “is not less than” k2k2 “is not less than” 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<const kBase*, vector<vBase*>, kBaseLessComapre> mapa;