一个结构中多点的算子

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

m8m*_*ble 5

我会以这种方式存储边的索引,小的索引总是第一个索引.看起来内部表示与您的应用程序无关.你不需要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>单独的变量firstIndexsecondIndex.这样做可以迭代索引.
  • 如果您使用array,可以缩短operator<使用时间std::lexicographical_compare.