一个结构中多点的算子

时间:2015-10-03 14:24:22

标签: c++ algorithm struct operator-keyword

我有一个存储两个应该可以互换的点的结构。

struct Edge
{
    unsigned short firstIndex;
    unsigned short secondIndex;
    Edge(unsigned short firstIndex, unsigned short secondIndex) :
        firstIndex(firstIndex), secondIndex(secondIndex) {}
};

operator==方法应如下(使它们可互换)

bool operator == (const Edge& e2) const
{
    return 
        first == e2.first && second == e2.second || 
        first == e2.second && second == e2.first;
}

我希望创建一个operator<operator>方法,以便在std::map

中使用该结构

我尝试了以下(使用乘法),但它不起作用,因为在很多情况下,不同的边返回相同的值

bool operator < (const Edge& e2) const
{
    return first * second < e2.first * e2.second;
}

我想使用的代码如下:

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;

虽然代码不适用于我的operator<方法,因为0 * 1 == 2 * 0因此,当我致电2时,地图会返回edgePoints[e3]

是否有人知道我可以使用operator<operator>方法,甚至可以使用其他方式映射边缘以使用std::map

2 个答案:

答案 0 :(得分: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

如果你想让你的实施更好,一些小的建议:

  • 首选std::array<unsigned short, 2>优先于单独的变量firstIndexsecondIndex。这样做可以迭代索引。
  • 如果您使用的是array,则可以使用std::lexicographical_compare缩短operator<

答案 1 :(得分:2)

考虑将它们作为排序对进行计算。

<?php
// $_GET['q'] is title
include('db.php');
$result = array();
$sel = "SELECT * FROM news WHERE title = '".$_GET['q']."' ";  // AND 10 MORE NEWS WHICH HAVE ID LOWER THAN THIS  $_GET['q'] ID .
$qry = @mysqli_query($conn , $sel);
$num = mysqli_num_rows($qry);
while($row = @mysqli_fetch_array($qry)) {
array_push($result, array('id' => $row['id'] , 'title' => $row['title'] ,  'desc' => $row['about'] , 'image' => $row['image'] , 'time' => $time , 'htitle'  => $row['Htitle'] , 'habout' => $row['Habout']));
}
echo json_encode(array('result' => $result));
?>

编辑:当然,将mins和maxes保存为局部变量可以写得更加简洁,但这个想法应该是明确的。

编辑:其他答案中的想法更好:强制你的结构总是少于第二个,它将消除所有分钟和最大值,并使比较快速运行像地狱一样)