2013-10-11 3 views
3

В C++ 11, есть хороший способ инициализировать вектор массивов (я имею в виду C++ класс) с одним элементом, какC++ - Инициализировать вектор массивов с одним элементом

std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1)); 

к инициализировать вектор 3x2 вектора со всеми 1s?

К несчастью, аналог для вектора массивов, похоже, не работает; я действительно обязан использовать цикл for?

ответ

5

Может быть, так?

#include <vector> 
#include <array> 
#include <iostream> 

int main() 
{ 
    std::vector< std::array<int, 2> > v(3, {1,1}); 

    for(auto const& e0 : v) 
    { 
     for(auto const& e1 : e0) 
      std::cout << e1 << ", "; 
     std::cout << "\n"; 
    } 
} 

Выход: "Почему мы должны использовать две скобки"

1, 1, 
1, 1, 
1, 1,

Исходный код на мой вопрос был

std::vector< std::array<int, 2> > v(3, {{1,1}}); 

, но я решил удалить, что вторая пара скобок. Они были там, чтобы подавить предупреждение clang ++. Обычно std::array содержит (необработанный) массив. Одной пары брекетов достаточно для инициализации этого внутреннего массива, но clang ++ выдает предупреждение, потому что элементы {1,1} (одна пара фигурных скобок) используются для инициализации элементов этого внутреннего массива, а не для совокупности (внешний std::array). Quoth лязг ++:

предупреждение: предложить распорки вокруг инициализации подобъекте

Я смотрел это в стандарте, и это требует в [array.overview]/2

Массив представляет собой совокупность (8.5.1), который может быть инициализирован с помощью синтаксиса

       инициализатор-лист};

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

передачи аргументов использует ту же спецификацию, как эта форму инициализации (называемой копирование инициализации, [dcl.init]/15), поэтому, используя одну пару фигурных скобок гарантируется на работу.

OTOH, нет требования, чтобы std::array содержит (необработанный) массив.

+0

Ваш код работает великолепно, но теперь у меня есть несколько вопросов: – Pippo

+0

Зачем нам использовать две скобки? – Pippo

+0

Почему этот метод не работает, если я инициализирую v как глобальную переменную (вне основной)? – Pippo

Смежные вопросы