2016-06-05 3 views
0

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

например.

std::vector<std::vector<int>> vv(5) по умолчанию инициализирует 5 векторов, но как инициализировать эти 5 векторов до размера?

+2

@lllllllllll 'авто & i' или вы изменяете копию. Но это не однострочная инициализация в любом случае. – interjay

+0

Почему бы не использовать массив C++? Лучше использовать изменение размера на следующей строке, а затем решения ниже ('... vv (5, std :: vector (5, 0));'). Я могу вместо значений int использовать int массивы размера 1 на основе логики 'OP'. – lllllllllll

ответ

4

Как следующее:

std::vector< std::vector<int> > vv(5, std::vector<int>(5, 0)); // Initialize with 0 
0

Используйте конструктор с двумя аргументами:

std::vector<std::vector<int> > vv(5, std::vector<int>(5)); 

не очень эффективным, хотя.

+0

Есть ли более эффективный способ сделать это? – Chara

+0

@Chara, Если вы ищете эффективный код, 2D-вектор - плохой старт. Если все внутренние векторы должны иметь одинаковую длину, вы можете использовать класс матрицы. Если вы знаете длину заранее, 'std :: array'. – chris

0

Lambdas допускает очень сложную инициализацию в одной строке, если одна строка действительно то, что вы хотите.

Это утверждение создает вектор из 5 векторов, каждый из которых содержит последовательность, 0-4, 5-9, 10-14 ...

auto vv = [] { 
    int i = 0; 
    std::vector<std::vector<int>> result; 
    result.reserve(5); 
    std::generate_n(std::back_inserter(result), 
        5, 
        [&i]{ 
         auto v = std::vector<int>(); 
         v.reserve(5); 
         std::generate_n(std::back_inserter(v), 5, [&i]{ return i++; }); 
        return v; 
        }); 
    return result; 
    }(); 

Если вы хотите на одной линии, просто удалить все пробелы:

(нет, я не советую это ...)

auto vv = [] { int i = 0; std::vector<std::vector<int>> result; result.reserve(5); std::generate_n(std::back_inserter(result), 5, [&i]{ auto v = std::vector<int>(); v.reserve(5); std::generate_n(std::back_inserter(v), 5, [&i]{ return i++; }); return v; }); return result; }(); 
+1

FYI, 'std :: iota' делает то, что делает ваш вызов' std :: generate_n'. – chris

+0

@chris, так оно и есть - по крайней мере для внутреннего цикла. вам все равно придется отслеживать значение для внешнего, верно? –

+0

Yup, это либо то, либо использовать итератор, который проходит через оба измерения (что не существует в стандарте). Альтернативно, 'array_view' обрабатывает это как одно измерение, а затем выполняет итерацию. – chris

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