Итерация по многомерному вектору (используя ключевое слово Auto?)

Существует ли изящный метод итерации многомерного вектора? Скажем, например, у вас есть 6D вектор, хотя я думаю, что 2D будет достаточно. Что-то вроде

vector< vector< int > myVector (6, vector<int> (5));

Есть ли хороший способ перебрать это, начиная с myVector[0][0], myVector[0][1], ...etc?? Я пробовал это на больших измерениях и использовал ключевое слово Auto для генерации итератора, но это бесполезно. Вот что я пытался:

for(auto it = myVector.begin(); it < myVector.end(); ++it)
std::cout << *it;

Но это не компилируется. Пожалуйста, прости мое ржавое понимание итераторов в STL, это было давно …

1

Решение

it это vector<vector<int>>::iteratorи после применения * вы получите обратно vector<int>, который не может быть распечатан. Вам нужно перебрать цикл:

for(auto i1 = myVector.begin(); i1 != myVector.end(); ++i1) // loops over the "external" vector
for(auto i2 = i1->begin(); i2 != i1->end(); ++i2) // loops over the "internal" vectors
std::cout << *i2;

Если у вас есть произвольные размеры, вы можете использовать следующее:

template <typename T>
void printVar(const T& v)
{
std::cout << v;
}

template <typename T>
void printVar(const std::vector<T>& v)
{
for (auto i = v.cbegin(); i != v.cend(); ++i)
{
printVar(*i);
}
}

Образец теста.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector