Как отсортировать «вектор», который содержит объекты класса?И почему я не прав? - PullRequest
2 голосов
/ 17 марта 2011

Сегодня я написал несколько кодов об использовании std :: sort () для работы с «векторным» типом, который содержит объекты классов, но я нашел много проблем в кодировании, пожалуйста, помогите мне найти решение:

#include <vector>
#include <algorithm>

class Obj{
private:
    int m_;
public:
    Obj():m_(0) {} 
    int act() { return m_; }
    bool operator<(Obj obj) {
        return this->act() < obj.act();
    }
}; 
bool cmp(Obj a, Obj b)
{
    return a.act() < b.act();
}
bool cmpA(const Obj& a, const Obj& b)
{
    return a.act() < b.act(); // @1 but wrong!
}
int foo()
{
    std::vector<Obj> vobj;
    // ...
    std::sort(vobj.begin(),vobj.end(),cmp); // @2 well, it's ok.
    std::sort(vobj.begin(),vobj.end());     // @3 but wrong!
    return 0;
}

@ 1: Почему тип параметра должен быть «Obj», а не «const Obj &»? Но когда 'Obj' является структурным типом, это не приведет к ошибке, почему?

@ 3: у меня была перегрузка оператора '<', но здесь невозможно пройти при компиляции. Я что-то упустил? Пожалуйста, помогите мне, спасибо! </p>

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

При использовании std::sort вы можете при желании передать компаратор, как и вы. Если вы этого не сделаете, std::sort будет использовать std::less в качестве компаратора, std::less по умолчанию будет использовать operator<.

Вы можете использовать ваш cmpA функтор, но тогда вы можете получить доступ только к const функциям-членам переданных объектов - у вас есть константная ссылка на них в cmpA.

class Obj{
private:
    int m_;
public:
    Obj():m_(0) {} 
    int act() const { return m_; } // const member function, can be called on const objects or references
}; 

bool operator<(Obj const & L, Obj const & R) { // The operator takes const references - it can compare const objects
    return L.act() < R.act();
}

Используя этот класс и оператор, вы можете вызывать std :: sort без передачи компаратора.

2 голосов
/ 17 марта 2011
int act() { return m_; }

должно быть

int act() const { return m_; }

и

bool operator<(Obj obj) {
    return this->act() < obj.act();
}

должно быть

bool operator<(const Obj& obj) const {
    return this->act() < obj.act();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...