gpt4 book ai didi

c++ - 指向成员的指针集

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:29 26 4
gpt4 key购买 nike

这行不通:

struct A {
int x1;
int x2;
};

int main() {
int A::*p1 = &A::x1;

set<int A::*> s;
s.insert( p1 ); // compile error: No operator<
unordered_set<int A::*> us;
us.insert( p1 ); // compile error: No hash function
}

我必须提供比较函数(对于 set)或散列函数(对于 unordered_set)。到目前为止我想到的唯一方法是检查成员指针下的原始字节:

struct XLess {
bool operator()( int A::* a, int A::*b ){
return memcmp( &a, &b, sizeof(a) ) < 0;
}
};

set<int A::*, XLess> s; // now appears to work

这是创建集合的可靠方法吗?它取决于由相同字节表示的相同指针。对此有更好的解决方案吗?

最佳答案

在形式上,不能保证。在实践中,指向成员的指针data 很可能只是一个简单的整数类型,而你应该没有问题。对于指向成员函数的指针,on另一方面:这些通常或多或少复杂结构,通常会包含填充,其内容是未定义,因此您的技术不起作用。

我也注意到,在第一个片段中,您使用了 std::unordered_set , 不是 std::set . std::unordered_set不使用排序函数,而是等价函数函数(并且 == 是为指向成员的指针定义的)和哈希函数。当然,实现哈希函数有与实现订购相同的问题。

话虽如此:你究竟为什么想要这样的一套。指向成员的指针(例如 int A::* )只能指向成员给定类型的(不是给定数组的成员类型),而且你不可能编写包含数千个的类成员。最简单的解决方案可能只是使用 std::vector<int A::*> , 和线性搜索 ( std::find ) 到确定成员资格。它可能比任何一个都快 std::set ,除非您确实有成千上万的成员。

关于c++ - 指向成员的指针集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675594/

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