Eli*_*zer 3 c++ algorithm struct operator-keyword
我有一个结构存储两个应该可以互换的点.
struct Edge
{
unsigned short firstIndex;
unsigned short secondIndex;
Edge(unsigned short firstIndex, unsigned short secondIndex) :
firstIndex(firstIndex), secondIndex(secondIndex) {}
};
Run Code Online (Sandbox Code Playgroud)
该operator==方法应该如下(为了让他们互换)
bool operator == (const Edge& e2) const
{
return
first == e2.first && second == e2.second ||
first == e2.second && second == e2.first;
}
Run Code Online (Sandbox Code Playgroud)
我期待创建一个operator<和operator>方法,以便在一个结构中使用结构std::map
我尝试了以下(使用乘法)但它不起作用,因为在许多情况下,不同的边返回相同的值
bool operator < (const Edge& e2) const
{
return first * second < e2.first * e2.second;
}
Run Code Online (Sandbox Code Playgroud)
我想使用的代码如下:
std::map<Edge, unsigned int> edgePoints;
Edge e1(0, 1);
Edge e2(1, 2);
Edge e3(2, 0);
edgePoints[e1] = 2;
edgePoints[e2] = 0;
edgePoints[e3] = 1;
Run Code Online (Sandbox Code Playgroud)
虽然代码不能与我的operator<方法一起使用,因为我调用时0 * 1 == 2 * 0地图会返回2edgePoints[e3]
有没有人知道我可以使用的方法operator<和operator>方法,甚至是一些其他方法来映射边缘以便使用std::map
我会以这种方式存储边的索引,小的索引总是第一个索引.看起来内部表示与您的应用程序无关.你不需要operator==地图.这是示例结构:
struct Edge
{
typedef unsigned short Idx; // prefer strong typedef cf boost
Edge(Idx a, Idx b)
:
firstIndex(std::min(a, b)),
secondIndex(std::max(a, b))
{}
Idx firstIndex;
Idx secondIndex;
bool operator<(Edge const & other)
{
if (firstIndex != other.firstIndex)
return firstIndex < other.firstIndex;
return secondIndex < other.secondIndex;
}
}; // Edge
Run Code Online (Sandbox Code Playgroud)
如果你想让你的实现更好,一些小的建议:
std::array<unsigned short, 2>单独的变量firstIndex和secondIndex.这样做可以迭代索引.array,可以缩短operator<使用时间std::lexicographical_compare.