Сортировка вектора указателей
У меня есть небольшая проблема, пытаясь отсортировать вектор указателей.
Это то, что я сделал до сих пор:
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
Ответы
Ответ 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()
.