gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:32:04 25 4
gpt4 key购买 nike

假设用户使用带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com