Хотя я думаю, что in silico является правильным (то есть std::vector<T>
не может быть членом T
, поскольку T
не завершено), давайте пока проигнорируем это. Вместо этого, я думаю, что ваш вопрос о том, как переместить объект:
std::sort(children.begin(), children.end(),
predicate);
(с подходящим предикатом) будет обменивать позиции двух узлов, std::swap()
используя их. Это создаст глубокое копирование и два задания глубокого копирования. Простое решение - заставить std::sort()
использовать пользовательскую функцию подкачки, которая просто меняет дочерние векторы:
class node {
...
public:
void swap(node& other) {
this->name.swap(other.name);
this->children.swap(other.children);
};
void swap(node& n0, node& n1) {
n0.swap(n1);
}
Как правило, для типов значений, использующих распределение (прямо или косвенно), вы, вероятно, захотите реализовать функцию swap()
. Поскольку это не требуется для правильного поведения, его часто добавляют позже, чтобы повысить производительность.