C++ 将常量对象引用传递给函子
我想创建输入事件对象到std::函数的映射。输入事件对象定义了==运算符,但由于map默认使用<检查相等性,并且my uses不需要排序,因此我想将compare函数设置为调用==运算符的函子。基本上,我想这样做:C++ 将常量对象引用传递给函子,c++,c++14,C++,C++14,我想创建输入事件对象到std::函数的映射。输入事件对象定义了==运算符,但由于map默认使用
#include <map>
struct Vertex
{
int x;
int y;
constexpr bool operator==(const Vertex& v)
{
return (x == v.x) && (y == v.y);
}
};
struct vertexCmp
{
bool operator()(const Vertex& v1, const Vertex& v2)
{
return v1 == v2;
}
};
int main()
{
std::map<Vertex, int, vertexCmp> _vertexMap;
Vertex v;
v.x = 1;
v.y = 1;
_vertexMap[v] = 1;
return 0;
}
我知道你不能在常量对象上调用非常量成员函数,但你会认为constexpr可以满足这个要求,对吗?我觉得我在这里想得太多了,有一种更好的方法来构造它。在C++11中,非静态成员函数上的
constepr
隐含了const
函数,但在C++14中没有(因为发现实际上存在constexpr
函数的用例,其中*此
不是const
)。您需要
constexpr bool operator==(const Vertex& v) const
在C++11中,非静态成员函数上的
constepr
意味着一个const
函数,但在C++14中不是这样(因为发现实际上存在constepr
函数的用例,其中*这个不是const
)
constexpr bool operator==(const Vertex& v) const
constexpr
和const
是不同类型的“恒常性”.constexpr
用于在编译时可能是常量的表达式。const
不允许在运行时修改值。只需将const
添加到运算符==
中,如果不需要排序,则无关紧要。std::map
需要排序才能正常工作。它无法使用相等比较。如果你做一个散列函数,你可以使用std::unordered_-map
。我非常喜欢使用散列函数和unordered_-map的想法,实际上,我认为这是一个更好的方法。谢谢。constexpr
和const
是不同类型的“恒定性”.constexpr
用于在编译时可能是常量的表达式。const
不允许在运行时修改值。只需将const
添加到运算符==
中,如果不需要排序,则无关紧要。std::map
需要排序才能正常工作。它无法使用相等比较。如果你做一个散列函数,你可以使用std::unordered_-map
。我很喜欢使用散列函数和unordered_-map的想法,事实上,我认为这是一个更好的方法。谢谢。你能给这个发现提供一个链接吗?会让你的答案更完美;)虽然我将实施Benjamin Lindley的建议,而不是我最初的方法,但感谢您回答这个问题。不过,我有一个后续问题,在非常量对象上使用操作符时,使操作符为常量会导致问题吗?你能给出该发现的链接吗?会让你的答案更完美;)虽然我将实施Benjamin Lindley的建议,而不是我最初的方法,但感谢您回答这个问题。不过,我有一个后续问题,在非常量对象上使用操作符时,使操作符为常量会导致问题吗?