Создать и инициализировать массив векторов за один раз - PullRequest
3 голосов
/ 17 июня 2010

Чтобы создать массив строк, это работает:

std::string array[] = {
    "first",
    "second",
    :
    "last"
};

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

std::vector<int> array[] = {
    {1, 2},
    {3, 4, 5}
    :
    {9}
};

Я получаю "не-агрегаты не могут быть инициализированы списком инициализаторов ".

Каков правильный синтаксис для инициализации массива векторов?

Обратите внимание, что мне нужно сделать это за один раз, как это и не использовать член векторафункции для заполнения векторов int с по одному (потому что я пытаюсь настроить файл, который будет создавать массив во время компиляции на основе чисел инициализации, поэтому вызов функций-членов в этом случае не помогает).

Ответы [ 4 ]

2 голосов
/ 18 июня 2010

Хотя цель использования массива векторов весьма сомнительна (почему бы тогда не использовать вектор векторов или двумерный массив?), Чтобы сделать то, что вы хотите, правильный синтаксис будет выглядеть так:

std::vector<int> array[] = {
    vector<int>(2),
    vector<int>(3),
    //...
    vector<int>(1)
};

Причина, по которой это не имеет никакого смысла, заключается в том, что в данном случае это семантически аналогично созданию массива указателей:

int* array[] = {
        new int[0],
        new int[0],
        //...
        new int[0],
    };

с той лишь разницей, что внутренне std :: vector самостоятельно управляет временем жизни этих указателей. Это означает, что если вы не создаете вектор постоянного размера (то есть без возможности перераспределения внутренней памяти вектора, что возможно, если вы либо объявляете вектор константным, либо просто убедитесь, что никогда не вызывайте resize, reserve, push_back, insert, erase и другие подобные методы), вы получите эффективный массив небольших объектов с указателем внутри. Так обычно реализуется вектор.

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

int fixed_size_array[100];

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

1 голос
/ 17 июня 2010

Может быть, что-то подобное приведет вас в нужном вам направлении?

const int arr[] = { 1, 2, 3, 4, 5 };

std::vector v( arr, arr + sizeof(arr) / sizeof(*arr) );
1 голос
/ 17 июня 2010

Короче говоря, это просто не поддерживается. Существуют различные обходные пути для получения аналогичного синтаксиса (например, Boost :: assign), но они не изменяют то, что вы получаете в исполняемом файле - они просто делают вызов функций-членов немного проще, чем строка вызовов до push_back.

0 голосов
/ 17 июня 2010

для создания вектора векторного кода

std::vector< std::vector< int > > v;

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

int arry[] = {1,2,3,4,5};
std::vector< int > list(arry, arry + sizeof(arry) / sizeof(int));

Таким образом, сконструированный вектор из целочисленного массива I 'я рекомендую вам использовать push_back() Method взамен в вашем сценарии.

Однако, если вы просто хотите испачкаться, вы можете пойти по пути, указанному выше, создать массив std::vector< int > и передать его конструктору std::vector< std::vector< int > >

Проверьте http://www.cplusplus.com/reference/stl/vector/vector/ для получения дополнительной информации. Вас может заинтересовать эта конкретная перегрузка конструктора template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

Neel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...