映射逻辑上相似的抽象类的键
map keys of abstract classes that are logically similar
假设用户使用具有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++映射使用等价概念来查找条目,这是通过"更少"比较定义的。如果 k1 “is not less than” k2
和 k2 “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;
相关文章:
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用