2014-09-23 2 views
1

У меня есть много массивов с разными размерами, так что они не могут быть многомерный массив, насколько я знаю, поэтому я назвал их следующим образом:построения имя переменной из переменной в C++

arr1[] 
arr2[] 
arr3[] 
arr4[] 
... 

теперь может я использовать цикл, чтобы пойти за ними и доступ к ним ...

for(int i=1; i<5; i++) { 
    for(int j=o; i<etc; j++) { 
    cout<<arr[i][[j]<<endl; 
    } 
} 
or cout<<arr+i<<endl; 

теперь это очевидно, говорит составитель добавить аранжировка и я вместе, но это не то, что я хочу. Я хочу, чтобы напечатать arr1, arr2 и т.д.

Я попытался, поставив точку, запятая, слэши и т.д.

+1

Почему бы не использовать 'станд :: вектор <станд :: вектор > '? – Jarod42

+0

, потому что использование массива - это требование, однако, можно ли положить все массивы разных размеров в вектор –

+1

Да, вы можете помещать массивы в массивы с помощью кучки, выделяя их и используя указатели –

ответ

4

No. Вы сделать нужен массив здесь. Более конкретно, вам нужен гетерогенный контейнер.

С магией косвенности, вы можете использовать гомогенный контейнер на C уровне ++ для достижения этой семантики:

std::vector<std::vector<WhateverYourTypeIs>> v; 

Если вам действительно нужны только пять во внешнем массиве, это сделает работу:

std::array<std::vector<WhateverYourTypeIs>, 5> a; 

и упростит ваш код.

+1

@Galik: Правильно, и OP сказал: «У меня много массивов разных размеров». Это означает разные типы. Конечно, теперь, когда я вводил косвенность (через «вектор»), я полагаю, что он не является более гетерогенным, в строгом смысле. –

0

Вы вводите в заблуждение время компиляции/сборки и время выполнения. Я бы предположил использовать только объекты времени выполнения, такие как массивы/векторы.

Но вы также можете использовать макросы или переменные списки аргументов: http://www.cprogramming.com/tutorial/c/lesson17.html

3

Если вы действительно вынуждены использовать простые массивы (и только тогда), следует использовать массив указателей тоже:

int* const array[] = {arr1, arr2, arr3, arr4, ...}; 

Таким образом, вы получаете указатель на первый элемент массива arr# с array+#.

Вы можете компаньона-массив, хранящий подсчетов элементов, тоже:

size_t carray[] = {sizeof arr1/sizeof *arr1, sizeof arr1/sizeof *arr2, 
    sizeof arr1/sizeof *arr3, sizeof arr1/sizeof *arr4, ...}; 

Кроме того, look at this for a safer way to get the element-count of an array:

template<size_t N, class T> 
constexpr size_t element_count(T (&arr)[N]) 
{return N;} 
Смежные вопросы