2017-01-05 2 views
2

гряда из C# мира, где я могу написать что-то вроде:Как преобразовать вектор в новый вектор с помощью range-v3?

var newList = oldList.Select(x => x * 2).Where(x => x > 3).ToList(); 

Это позволяет мне взять список, превратить его в некотором роде, и сохранить результат в новом списке.

Я хотел бы сделать то же самое в C++, используя . Я понимаю, как работают преобразования, но делает аналогичными методами «стоков» для вычисления и сбора результатов?

Я искал что-то вроде toVector, которое вычислило бы полученный диапазон в только что выделенном std::vector.

+0

Вы можете построить 'зЬй :: VECTOR' из' диапазона '. – Jarod42

+1

@ Jarod42 Можете ли вы привести пример? Эквивалент моему фрагменту C# выше был бы идеальным. – sdgfsdh

+0

Используя стандартную библиотеку, вы можете сделать: std :: for_each (oldList.begin(), oldList.end(), [& newList] (auto & val) {if (val> 3) newList.push_back (val * 2);}); 'Но вам нужно будет создать переменную' newList' перед вызовом. [demo] (http://coliru.stacked-crooked.com/a/4eace3968a9d84b0) – wally

ответ

4

Вы можете сделать:

std::vector<int> v2 = v 
        | ranges::view::transform([](int x) { return x * 2; }) 
        | ranges::view::filter([](int x) { return x > 3; }); 

Demo

Или, если вы предпочитаете auto слева:

auto v2 = v 
     | ranges::view::transform([](int x) { return x * 2; }) 
     | ranges::view::filter([](int x) { return x > 3; }) 
     | ranges::to_vector; 
+0

Можете ли вы добавить версию, используя 'auto v2 =' слева? Меня интересует, как работает API. – sdgfsdh

+0

@sdgfsdh: 'auto' даст некоторый диапазон (ленивый) вид. Не уверен, чего вы ожидаете. – Jarod42

+0

Да, но есть ли какой-то модификатор, который можно добавить в RHS, который делает 'auto v2' в' std :: vector'? например '... | диапазоны :: toVector(); ' – sdgfsdh

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