Подтвердить что ты не робот

Сортировка вектора указателей

У меня есть небольшая проблема, пытаясь отсортировать вектор указателей.

Это то, что я сделал до сих пор:

class Node
{
    private:
    vector <Node*> _children;
    string _data;
    ...
    public:
    void Node::add_child(Node* child)
    {
        ...
        sort(_children.begin(), _children.end());
    }

    bool Node::operator<(const Node& node)
    {
        return (this->_data.compare(node._data) == -1);
    }
};

Мой меньший оператор работает, если я пишу вот так:

Node* root = new Node("abc");
Node* n = new Node("def");
cout << (*root<*n) << endl;

Почему сортировка никогда не вызывает оператора? Любая помощь будет оценена! Спасибо.

madshov

4b9b3361

Ответ 1

Поскольку вы сортируете значения указателя, а не Node, на которые они указывают.

Вы можете использовать третий аргумент алгоритма std::sort, чтобы указать пользовательский компаратор.

Например:

bool comparePtrToNode(Node* a, Node* b) { return (*a < *b); }

std::sort(_children.begin(), _children.end(), comparePtrToNode);

(обратите внимание, что этот код является всего лишь показанием - вам нужно будет добавить дополнительные проверки безопасности там, где это необходимо)

Ответ 2

Ваш менее чем оператор принимает аргументы const Node&, но ваш вектор сортирует Node* s. Вам нужно указать функцию сравнения в качестве третьего параметра для std::sort.

class Node
{
    private:
    vector <Node*> _children;
    string _data;
    struct PointerCompare {
      bool operator()(const Node* l, const Node* r) {
        return *l < *r;
      }
    };
    public:
    void add_child(Node* child)
    {
        sort(_children.begin(), _children.end(), PointerCompare());
    }

    bool operator<(const Node& node) const
    {
        return (this->_data.compare(node._data) == -1);
    }
};

Кроме того, ваш operator< должен быть объявлен const.

Ответ 3

Ваш operator<() работает с ссылками на объекты Node; но вектор содержит указатели на объекты Node, которые нельзя сравнить с этой функцией. Вам нужно будет явно указать правильную функцию (та, которая принимает указатели как аргументы) алгоритму sort().