C++ sort std::使用运算符()设置插入顺序
之后我将继续这篇文章 我们的课程是:C++ sort std::使用运算符()设置插入顺序,c++,sorting,C++,Sorting,之后我将继续这篇文章 我们的课程是: class LaneConnector { public: const Lane* getLaneFrom() const { return From; } const Lane* getLaneTo() const { return To; } private: Lane* From; Lane* To; } 和要比较的函子: struct MyLaneConector
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();
}
};
struct MyLaneConectorSorter{
布尔运算符()(常数LaneConnector*rhs,常数LaneConnector*lhs)常数
{
//您可能需要在这里进行一些空指针检查
常量车道*a=lhs->getLaneFrom();
常量车道*b=rhs->getLaneFrom();
返回a->getLaneID()getLaneID();
}
};
最后是源和目标集:
const std::set<LaneConnector*> src = ..... ;
const std::set<LaneConnector*, MyLaneConectorSorter> dest(src.begin(), src.end(), MyLaneConectorSorter());
const std::set src=;
const std::set dest(src.begin()、src.end()、MyLaneConectorSorter());
dest集的大小将是1,而src有更多(在我的例子中是14)
我可能做错了什么?我珍视你的善意评论。谢谢有一种非常简单的方法,可以在问题暴露出来之前,通过这种方法抓住问题。编写单元测试
我猜你所有的LaneConnector都是从同一条线路开始的。因此,GetLaneFrom()->GetLaneID()在所有LaneConnector上产生相同的结果
std::set
基于键跟踪元素。在比较器中,您有返回a->getLaneID()getLaneID()代码>。因此,车道ID
隐式成为键。由于如果a
和b
具有相同的LaneID
,则MyLaneConectorSorter(a,b)
和MyLaneConectorSorter(b,a)
都返回false
因此,您的集合
不能包含多个具有相同LaneID的LANECONNECTOR
LANECONNECTOR是否具有不同的车道ID?集合需要唯一的ID,如果比较器说两个键相同,我不确定集合中会发生什么。显示真实代码!如果set dest应该存储指针,那么比较器也需要获取指针!在比较函数中,你似乎有一些关于左右的混淆。你把LaneConnector
和MyLaneConnectorSorter
分别拼成两个“n”和一个“n”,这也让我很不舒服。@rahman你错了std::set
具有唯一的条目,唯一性由比较函数确定。如果您的ID是重复的,则集合会认为元素是相同的。可能您想要的是std::multiset
而不是std::set
。无论如何,如果所有ID都相同,我无法理解您希望从MyLaneConnectionSorter获得什么样的订单。