std::set 唯一指针
std::set Unique Pointer
struct departure_compare {
bool operator() (const Leg* lhs, const Leg* rhs) const
{
return lhs->CurrentDepartureTime() < rhs->CurrentDepartureTime();
}
};
class Station
{
uint station_number_;
std::set<Leg *, departure_compare> departure_legs_in_order_; // legs that depart from this station in order of departure time
public:
Station(uint station_number) : station_number_(station_number) {};
void addDepartureLeg(Leg *leg) { departure_legs_in_order_.insert(leg); };
const std::set<Leg *, departure_compare>& DepartureLegs() const { return departure_legs_in_order_; };
uint StationNumber() { return station_number_; };
};
我循环调用这个
Leg *new_leg = new Leg();
start_station->addDepartureLeg(new_leg); // start_station of type station
现在我认识到,有时它不会将 new_leg
插入到此结构中。现在我查看了文档,上面说如果它已经在集合结构中,那么它不会插入 new_leg
。但是,如果我总是创建一个新指针(地址不应该是唯一的),这怎么可能?
您不是根据地址确定唯一性,因为 departure_legs_in_order_
声明为
std::set<Leg*,departure_compare> departure_legs_in_order_;
您已告诉 set
使用 departure_compare
来确定哪些 Leg*
值相等。如果两者的 Leg::CurrentDepartureTime()
相同,则它们相等,在这种情况下,insert
将 return 现有条目。并泄漏你的指针,如果你没有注意到,忘记清理它。
struct departure_compare {
bool operator() (const Leg* lhs, const Leg* rhs) const
{
return lhs->CurrentDepartureTime() < rhs->CurrentDepartureTime();
}
};
class Station
{
uint station_number_;
std::set<Leg *, departure_compare> departure_legs_in_order_; // legs that depart from this station in order of departure time
public:
Station(uint station_number) : station_number_(station_number) {};
void addDepartureLeg(Leg *leg) { departure_legs_in_order_.insert(leg); };
const std::set<Leg *, departure_compare>& DepartureLegs() const { return departure_legs_in_order_; };
uint StationNumber() { return station_number_; };
};
我循环调用这个
Leg *new_leg = new Leg();
start_station->addDepartureLeg(new_leg); // start_station of type station
现在我认识到,有时它不会将 new_leg
插入到此结构中。现在我查看了文档,上面说如果它已经在集合结构中,那么它不会插入 new_leg
。但是,如果我总是创建一个新指针(地址不应该是唯一的),这怎么可能?
您不是根据地址确定唯一性,因为 departure_legs_in_order_
声明为
std::set<Leg*,departure_compare> departure_legs_in_order_;
您已告诉 set
使用 departure_compare
来确定哪些 Leg*
值相等。如果两者的 Leg::CurrentDepartureTime()
相同,则它们相等,在这种情况下,insert
将 return 现有条目。并泄漏你的指针,如果你没有注意到,忘记清理它。