Просто следите за памятью самостоятельно, а не с помощью вектора:
class Node {
public:
// In the constructor, initialize your array of children to NULL
// and the size of your children array to zero
Node() : mChildren(NULL), mSize(0) {}
void AddChild(Node* newChild) {
// allocate space for your new array
Node** newArray = new Node*[mSize + 1];
// copy over nodes from old array to new array
for (int i = 0; i < mSize; i++) {
newArray[i] = mChildren[i];
}
// add in our new child to the end of the array
newArray[mSize++] = newChild;
// if there was an old array (null check) free the memory
if (mChildren) {
delete [] mChildren;
}
// set our children array equal to our new array
mChildren = newArray;
}
Node* AccessChild(size_t index) {
// make sure it's a valid index and then return
assert(index < mSize);
return mChildren[index];
}
private:
Node** mChildren;
int mSize;
};
Это не будет иметь дополнительного пространства для дополнительных узлов, но для этого потребуется размер int, чтобы отслеживать, сколько узлов вы храните. Я не вижу, как вы могли бы сделать это без этого или без постоянного числа детей.
Обратите внимание, что векторы удваиваются по размеру каждый раз, когда им нужно перераспределить, потому что это более эффективно. Хотя приведенное выше решение будет более эффективным с точки зрения памяти, оно значительно ухудшит производительность, поскольку потребует выделения для каждого дочернего дополнения, которое потребует O (N) для добавления N узлов.
Производительность вектора будет состоять из O (log (N)) для добавления N узлов, но опять-таки это решение звучит так, как будто у вас есть требуемая эффективность памяти.