gpt4 book ai didi

c++ - 如何使用不同类型的键搜索 std::map

转载 作者:可可西里 更新时间:2023-11-01 16:04:39 27 4
gpt4 key购买 nike

如果我有std::map<X, Blah> ,使用 Y 的实例在 map 中查找匹配项目的最佳方式是什么? ?

假定Y中的信息足以唯一地找到 X , 但出于性能原因,我不想创建 X 的实例通过复制 Y值(value)观。

我意识到我可以通过为 X 创建一个公共(public)基类或接口(interface)来做到这一点和 Y并将其设为 map 键,但还有其他方法吗?例如创建某种比较器对象?

为清楚起见,这里是示例代码:

class X
{
public:
int id;
int subId;
};

std::map<X, Details> detailsMap;

class Y
{
public:
int getId();
int getSubId();
int someOtherUnrelatedThings1;
int someOtherUnrelatedThings2;
};

现在,如果我有一个 Y 的实例, 原则上我应该能够在我的 map 中找到匹配的项目,因为我可以获得 idsubId一对。但是我可以在不创建 X 的实例的情况下做到这一点吗?并复制 idsubId

最佳答案

在 C++14 中,您可以使用异构查找。

如果你想找到一个元素,其键将 等价std::map::find 的参数进行比较,你应该提供一个比较器作为第三个模板参数应该有 Comparator::is_transparent 表示为一个类型。它还应包含 bool operator() 将您的映射键与您想要的任何其他类型进行比较。

撇开有趣的描述不谈,这里有一个例子:

struct X
{
int id;
int subid;
};

struct Details {};

struct Comparator
{
using is_transparent = std::true_type;

// standard comparison (between two instances of X)
bool operator()(const X& lhs, const X& rhs) const { return lhs.id < rhs.id; }

// comparison via id (compares X with integer)
bool operator()(const X& lhs, int rhs) const { return lhs.id < rhs; }
bool operator()(int lhs, const X& rhs) const { return lhs < rhs.id; }

// Same thing with Y
bool operator()(const X& lhs, const Y& rhs) const { return lhs.id < rhs.getId(); }
bool operator()(const Y& lhs, const X& rhs) const { return lhs.getId() < rhs.id; }
};

int main()
{
std::map<X, Details, Comparator> detailsMap = {
{ X{1, 2}, Details{} },
{ X{3, 4}, Details{} },
{ X{5, 6}, Details{} }
};

// it1 and it2 point to the same element.
auto it1 = detailsMap.find(X{1, 2});
auto it2 = detailsMap.find(1);

std::cout << detailsMap.size() << std::endl;
std::cout << std::boolalpha << (it1 == detailsMap.end()) << std::endl; // false
std::cout << std::boolalpha << (it1 == it2) << std::endl; // true
}

但请注意,GCC 直到修订 219888 才实现它.

关于c++ - 如何使用不同类型的键搜索 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31923715/

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