C ++ Массив переменных размеров - PullRequest
0 голосов
/ 08 апреля 2010

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

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

String *2d_array[][] = {{"A1","A2"},{"B1","B2","B3"},{"C1"}};

for (int i=0; i<2d_array.length; i++) {
    for (int j=0; j<2d_array[i].length; j++) {
         print(2d_array[i][j]);
    }
}

Есть ли разумный способ сделать это? Возможно, используя вектор или другую структуру?

Спасибо:)

1 Ответ

2 голосов
/ 08 апреля 2010

Вы используете простой массив C из строковых объектов C ++.В C нет массивов переменного размера.Кроме того, этот код не будет компилироваться в любом случае, в такой конструкции компилятор будет генерировать массив массивов, которые имеют максимальную объявленную длину.В нашем примере это будет

String *2d_array[3][3] 

. Если вы хотите использовать массивы переменного размера, вы должны использовать C ++ STL (стандартную библиотеку шаблонов), такие как vector или list:

#include <string>
#include <vector>

void f()

{
    typedef std::vector<std::string>   CStringVector;
    typedef std::vector<CStringVector> C2DArrayType;
    C2DArrayType theArray;

    CStringVector tmp;
    tmp.push_back("A1");
    tmp.push_back("A2");
    theArray.push_back(tmp);

    tmp.clear();
    tmp.push_back("B1");
    tmp.push_back("B2");
    tmp.push_back("B3");
    theArray.push_back(tmp);

    tmp.clear();
    tmp.push_back("C1");
    theArray.push_back(tmp);

    for(C2DArrayType::iterator it1 = theArray.begin(); it1 != theArray.end(); it1++)
        for(CStringVector::iterator it2 = it1->begin(); it2 != it1->end(); it2++)
        {
            std::string &s = *it2;
        }
}
...