std::transform, возвращающий новый диапазон

Алексей Горностаев
Алексей Горностаев

На текущий момент процесс преобразования данных выглядит так:

  std::vector<int> foo  = {1,2,3};
  std::vector<int> bar;

  bar.resize(foo.size());

  std::transform (foo.begin(), foo.end(), bar.begin(), op_increase);

Хотелось бы иметь такой вариант:

  std::vector<int> foo = {1,2,3};  
  std::vector<int> bar = std::transform (foo.begin(), foo.end(), op_increase);

Это позволит использовать std::transfrom в качестве аргумента функции, избавит от лишнего кода и позволит немного повысить 
производительность за счет передачи rvalue непосредственно в функцию без предварительного создания промежуточного объекта

-6
рейтинг
3 комментария
Олег Ляттэ
А откуда такой transform будет знать, что результат нужно складывать именно в vector, а не list или ещё какой-нибудь deque? Не уверен, что из итераторов на входе можно надёжно определить контейнер для хранения, тем более, что в качестве итераторов мы можем использовать пару указателей на каким-то хитрым способом выделенную память.
Олег Ляттэ
dix75
Соглашусь с предыдущим постом. Если Вам необходимо такое поведение напишите враппер или их коллекцию
dix75
dmitriy@izvolov.ru
foo | ranges::view::transform(op_increase) | ranges::to_vector;
dmitriy@izvolov.ru
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).