Вставки в C ++ путаница - PullRequest
       25

Вставки в C ++ путаница

0 голосов
/ 21 апреля 2019

Так что я не понимаю, как использовать вставки в этой ситуации.Я знаю, что такое вставки, я знаю о std :: front_inserter и std :: back_inserter и std :: insertter, но я запутался в этой проблеме, которую я сейчас представлю.Мне нужно сделать функцию, которая преобразует элементы вектора и помещает их в deque (или, в любом случае, вектор, его универсальная функция).Эта функция имеет 5 параметров, одна из которых является другой функцией (которая может иметь только один параметр, но не указано, какой тип (я имею в виду, что это может быть ссылка, итератор, указатель ... и т. Д.)).

Если мой вектор:

std::vector<int> v={1,2,3,4,5};

Мне нужно внести некоторые изменения с помощью лямбда-функции, которая позволит моему деку иметь такие элементы:

25 16 9 4 1

Итак, выувидеть, что первый элемент deque является последним элементом вектора ^ 2 (вы можете увидеть, что я хочу сделать).Итак, мой вопрос: как можно решить проблему с помощью вставок?Я имею в виду, должен ли я как-то поместить модуль ввода в лямбда-функцию?Может быть, лямбда должна быть такой:

[](int x) { 
x=x*x;
std::front_inserter(q);
}

Я думал об этом, но потом я не понимаю, как будет работать эта лямбда, когда я отправляю ее в качестве параметра этой "большой" функции?Как он узнает, что такое q внутри большой функции?

Я надеюсь, вы понимаете, что я хочу сделать.

Вот пример.Итак, я должен сделать какую-то функцию, и это прототип (допустим, это void):

typename<template Type1, template Type2>
void Fun(Type1 p1,Type1 p2,Type2 p3,Type2 p4,void (*f)(std::remove_reference<decltype(*p1)>::type) );

Допустим, у меня есть следующий код в main:

int main() {
std::vector<int> v={1,2,3,4,5};
std::deque<int> d(5);
Fun(v.begin(),v.end(),d.begin(),d.end(), /* some lambda function */);

1 Ответ

2 голосов
/ 21 апреля 2019

Если вас интересует только преобразование, а не реализация функции с этим типом,

std::deque<int> d;
std::transform(v.begin(), v.end(), std::front_inserter(d), [](int x){return x * x;});

или

std::deque<int> d;
std::transform(v.rbegin(), v.rend(), std::back_inserter(d), [](int x){return x * x;});
...