binary_search on属性的汇编错误
Compilation error for a binary_search on the attributes
我有一个 X
v
class X
{
public:
int attribute_1;
...
operator==(const int i){return this->attribute_1 == i;}
};
std::vector<X> v;
向量v
由属性attribute_1
排序。我想执行binary_search
来测试给定整数是否与X
实例之一的attribute_1
匹配。我尝试了
int elem = 12
bool isElementPresent = std::binary_search(
v.begin(),
v.end(),
elem,
[](const X& right, const X& left){return right.attribute_1 < left.attribute_1;}
)
)
但是它无法编译。如果我创建一个将X
的实例使用attribute_1
设置为elem
,那么它有效,但我想避免执行此操作(因为1.构建具有许多其他属性的类 X
的对象,我会需要写一个极简主义的构造函数,并且很害怕我会错误地将其在代码中的其他地方使用)。
我本来希望operator==
过载会使它起作用。为什么不起作用?是否有一个解决方案不会迫使我使用attribute_1 = elem
创建X
的实例?
为什么不起作用?
std::binary_search
也使用比较对象来检查平等。这样做类似于comp(a, b) || comp(b, a)
。如果该表达式为false,则A均不小于B或B小于A。因此它们必须相等。
由于此用法,比较对象需要接受集合的对象,以及搜索为 act 的值。第一个和第二个参数。
一种解决方案是使用"投影"类,其对象可以从所讨论的类以及要与您要比较的值中构造。在第一种情况下,投影类从类成员中提取值,然后将其存储给其自己的成员。在另一种情况下,它只是将价值复制到其自己的成员。
有趣的是,这甚至可以变得非常通用:
template<typename D, typename P, P> struct projection;
template<typename Data, typename Class, typename Return, Return (Class::*member_function) () const>
struct projection<Data, Return (Class::*) () const, member_function> {
Data data;
projection (Class const & object)
: data ((object.*member_function)()) {}
/* template<typename X>
projection (X&& input)
: data (std::forward<X>(input)) {}*/
projection (Data d) : data (d) {}
};
然后将此投影类用作搜索使用的比较对象的两个参数。示例:
struct Item {
int x;
int get () const { return x; }
};
int main () {
Item items [] = {1,2,3,4,5,99};
using P = projection<int, decltype(&Item::get), &Item::get>;
auto compare = [](P const & left, P const & right) {
return left.data < right.data; };
std::cout << std::binary_search(
std:: begin (items), std::end(items),
4, compare)
<< std::endl;
std::cout << std::binary_search(
std:: begin (items), std::end(items),
44, compare)
<< std::endl;
}
上面的代码使用常数成员函数(" Getters"),但是有了以下专业化,它也适用于成员的指针:
template<typename Data, typename Class, typename Member, Member (Class::*member_pointer)>
struct projection<Data, Member (Class::*), member_pointer> {
Data data;
projection (Class const & object)
: data (object.*member_pointer) {}
/* template<typename X>
projection (X&& input)
: data (std::forward<X>(input)) {}*/
projection (Data d) : data (d) {}
};
相关文章:
- SSE 内联汇编和可能的 g++ 优化错误
- 汇编错误:调用基本型构造函数时无效的转换
- 为什么我的GLSL着色器失败汇编而没有错误消息
- 为什么将char*传递给字符串参数会产生汇编错误
- Android Studio 3 C 文件中充满了错误,但汇编还可以
- C 汇编错误:无匹配的构造函数以进行初始化
- C 11线程汇编错误传递字符串作为复制的引用
- Python安装汇编错误
- binary_search on属性的汇编错误
- 从源构建时,提升iostreams中的汇编错误
- Gmock方法正在抛出汇编错误
- G 生成逻辑上错误的汇编代码
- 增加精神汇编错误
- 汇编错误C 在标题文件中添加函数时
- 为什么我会遇到这些汇编错误
- 代码中的汇编错误
- 关于隐藏,覆盖和虚拟表的汇编错误
- C 汇编错误:对构造函数的引用是模棱两可的
- Berkelium汇编错误
- OpenMP在os x上的汇编错误