使用operator()对std :: set进行排序以对插入进行排序

时间:2012-09-25 06:49:57

标签: c++ sorting

我在This之后继续这篇文章  我们有一个班级:

class LaneConnector {
public:

    const Lane* getLaneFrom() const {
        return From;
    }
    const Lane* getLaneTo() const {
        return To;
    }

private:

    Lane* From;
    Lane* To;
}

和一个比较的仿函数:

struct MyLaneConectorSorter {
  bool operator() (const LaneConnector* rhs, const LaneConnector* lhs) const
  {
    // you may want to put some null pointer checks in here
    const Lane* a = lhs->getLaneFrom();
    const Lane* b = rhs->getLaneFrom();
    return a->getLaneID() < b->getLaneID();
  }
};

最后是源和目标集:

const std::set<LaneConnector*> src = ..... ;

const std::set<LaneConnector*, MyLaneConectorSorter> dest(src.begin(), src.end(), MyLaneConectorSorter());

目标集的大小为1,而src的大小为更多(在我的情况下为14)

我可能做错了什么?我非常重视你的评论。谢谢

2 个答案:

答案 0 :(得分:1)

std::set根据 跟踪元素。在比较器中,您有return a->getLaneID() < b->getLaneID();。因此Lane ID隐含地成为 。由于ab具有相同的LaneID,因此MyLaneConectorSorter(a, b) MyLaneConectorSorter(b, a)都会返回false

因此,您的set不能包含多个LaneConnectior LaneID

答案 1 :(得分:0)

有一种非常简单的方法可以在他们有机会暴露自己之前以这种方式捕捉问题。写单元测试!

我的猜测是你所有的LaneConnectors都从同一行开始。因此,GetLaneFrom() - &gt; GetLaneID()在所有LaneConnectors上产生相同的结果