假设用户使用带有 kBase
vBase
类的库。用户添加对他可用的类的键和值对(他使用库实现它们)- v
和 k
。在库中,添加后,我希望将逻辑上相似(具有相同字符串)的键“合并”为一个键。
他是我尝试过的代码示例:
//---------------------------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“不小于”k2
且 k2“不小于”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/