2015-11-28 5 views
1

Я хочу, чтобы создать вектор {i, 0} пар, где я от 0 до п - 1, используя функцию STL generate и мой текущий код выглядит следующим образомСоздание вектора элементов пары с использованием STL в C++

std::vector<std::pair<int, int>> new_vertex(n);  
int i = -1; 
std::generate(new_vertex.begin(), new_vertex.end(), [&]{ 
    i += 1; 
    return {i, 0}; 
}); 

Мой вопрос в том, что есть намного лучший/более холодный способ сделать это, используя функцию STL, например, используя transform в некотором странном порядке, предпочтительно тот, который удаляет использование объявления переменной int i = -1 сверху?

+2

С Эрик [Ranges библиотека] (https://github.com/ericniebler/range-v3), который должен в конечном итоге сделать свой путь в стандарт, вам может генерировать бесконечный список 0, 1, 2, ..., затем преобразовать их в {0, 0}, {1, 0}, {2, 0}, ..., затем взять первые n из них, или даже держать его как есть, и пусть все, что ему нужно, берет то, что ему нужно. – chris

+0

Я думаю, что это хорошее решение. Использование [std :: transform()] (http://en.cppreference.com/w/cpp/algorithm/transform) требует итераций 'N', а также [std :: generate()] (http: // en .cppreference.com/ж/CPP/алгоритм/генерации). Таким образом, с точки зрения производительности, это то же самое. – Jens

+0

Да, но я сомневаюсь, что кто-то одобрит это, это хорошая практика программирования. Подумайте об этом, я могу определить 'i' в любом месте, и его можно манипулировать 20 различными способами. перед выполнением 'generate'. Мой основной вопрос заключается в том, что, учитывая огромный размер стандарта C++, есть ли лучший/более безопасный способ, чем это? – suyash

ответ

4

В C++ 14. Я сделал бы счетчик частным для лямбды. Я бы также не инициализировать элементы вектора т.к:

#include <algorithm> 
#include <iterator> 

v.reserve(n); 

std::generate_n(std::back_inserter(v), n, 
       [i = 0]() mutable { return std::make_pair(i++, 0); }); 
+0

[demo] (https://ideone.com/u1PiMY) –

+0

Всегда здорово узнать что-то новое :-) Спасибо Kerrek! – Jens

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