Используйте std::vector<std::vector<node> >
, но используйте vector::reserve()
разумно, чтобы избежать перераспределения:
using std::vector;
vector<vector<node>> v(d); // 0 nodes allocated, no wasted space yet
using std::copy;
using std::istream_iterator;
using std::back_inserter;
// Wish I could v[0].reserve(), but we don't have that info yet.
copy(istream_iterator<node>(std::cin), istream_iterator<node>(), back_inserter(v[0]));
// foreach v[1..d-1], compute v[i] from v[i-1]
for(int i = 1; i < d; ++i) {
int size = ComputeSize(v[i-1]); // how big a list do we need?
v[i].reserve(size); // reserve the space for it, and
PopulateVectorFromVector(v[i-1], v[i]); // fill it in.
}
Единственный вектор с потерянным пространством и временем - это v [0].
EDIT : вызов std::copy
выше - идиома без цикла, примерно эквивалентная
node tmp;
while(std::cin >> tmp) {
v[0].push_back(tmp);
}
std::copy
, принимает три аргумента.Первые два - входные итераторы , которые определяют диапазон, из которого мы копируем, а третьи - выходной итератор , определяющий место назначения.
В частности, istream_iterator<node>(std::cin)
- итератор ввода, который при разыменовании считывает следующий node
из стандартного потока ввода.back_inserter(v[0])
- это выходной итератор, который при разыменовании и назначении вызывает v[0].push_back()
.