实施“<”运算符
Implementing the '<' operator
使用以下简单的 class 作为 std::map
中的键(省略函数),实现“<”运算符的正确方法是什么?
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
}
您可以使用 std::tie
。
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
bool operator<(const Person& r) const
{
return std::tie(valid, name, id) < std::tie(r.valid, r.name, r.id);
}
}
解释:
std::tie(xs...)
通过 字典顺序 比较元素创建 std::tuple
of references to the passed xs...
arguments. Comparison between two std::tuple
instances 作品,从而为您的类型提供排序。
更多信息here on cppsamples and in this question。
#include <string>
#include <tuple>
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
};
bool operator<(const Person& l, const Person& r)
{
return std::tie(l.valid, l.name, l.id) < std::tie(r.valid, r.name, r.id);
}
您可以按照其他答案的建议使用 std::tie
。如果你想清楚地看到你自己的函数中的逻辑或者没有访问 C++11 编译器,你可以将它实现为:
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
bool operator<(Person const& rhs) const
{
if ( this->valid != rhs.valid )
{
return ( this->valid < rhs.valid );
}
if ( this->name != rhs.name )
{
return ( this->name < rhs.name );
}
return ( this->id < rhs.id );
}
};
使用以下简单的 class 作为 std::map
中的键(省略函数),实现“<”运算符的正确方法是什么?
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
}
您可以使用 std::tie
。
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
bool operator<(const Person& r) const
{
return std::tie(valid, name, id) < std::tie(r.valid, r.name, r.id);
}
}
解释:
std::tie(xs...)
通过 字典顺序 比较元素创建 std::tuple
of references to the passed xs...
arguments. Comparison between two std::tuple
instances 作品,从而为您的类型提供排序。
更多信息here on cppsamples and in this question。
#include <string>
#include <tuple>
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
};
bool operator<(const Person& l, const Person& r)
{
return std::tie(l.valid, l.name, l.id) < std::tie(r.valid, r.name, r.id);
}
您可以按照其他答案的建议使用 std::tie
。如果你想清楚地看到你自己的函数中的逻辑或者没有访问 C++11 编译器,你可以将它实现为:
class Person
{
public:
bool valid = false;
std::string name = "";
std::string id = "";
bool operator<(Person const& rhs) const
{
if ( this->valid != rhs.valid )
{
return ( this->valid < rhs.valid );
}
if ( this->name != rhs.name )
{
return ( this->name < rhs.name );
}
return ( this->id < rhs.id );
}
};