2015-08-04 2 views
-3
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. Но как это возможно, если я всегда создаю новый указатель (не должен ли адрес быть уникальным)?

+4

Почему указатели и динамическое распределение? –

+0

@ Планы на орбите Лучше не динамически выделять ногу и использовать прямую структуру внутри набора без указателей? Я так думал, что я сохраняю память – quesaionasis

+2

Вы используете _more_ память таким образом, а также экономя память. –

ответ

5

Вы не определения уникальности на основе адреса, потому что departure_legs_in_order_ объявлен как

std::set<Leg*,departure_compare> departure_legs_in_order_; 

Вы сказали set использовать departure_compare, чтобы определить, какие Leg* значения равны. И они равны, если Leg::CurrentDepartureTime() одинаково для обоих, и в этом случае insert вернет существующую запись. И пропустите указатель, если не заметите, и забудьте очистить его.

Смежные вопросы