Большинство функциональных языков программирования (например , Common Lisp, Scheme / ракетки, Clojure, Haskell, Scala, Ocaml, SML) поддерживают некоторые общие функции высшего порядка в списках, такие как map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(см , например , Common Lisp, Scheme / Ракетка, Clojure бок о бок справочный лист , Haskell , Scala , OCaml и документацию SML .)
Есть ли в C ++ 11 эквивалентные стандартные методы или функции в списках? Например, рассмотрим следующий фрагмент Haskell:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Как я могу выразить второе выражение в современном стандарте C ++?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
Как насчет других функций высшего порядка, упомянутых выше?
Могут ли они быть прямо выражены в C ++?
Data.Sequence
в Haskell? Это сравнительно безобразно.[a]
. Вы должны либо скрыть функцию prelude, взломать prelude, либо выбрать другое и менее интуитивное имя.Functor
,Foldable
ИTraversable
добиться этого как абстрактно, как я могу думать.Data.Sequence
является примером всего этого, так что вы можете просто сделатьfmap (\x -> x * x) xs
.map
этоfmap
специализирован для начинающих.Ответы:
Более того, в C ++ есть такие функции, взгляните на заголовок алгоритма (или с добавлением C ++ 11 ):
Их можно легко использовать с любым контейнером.
Например, ваш код может быть выражен следующим образом (с лямбдами C ++ 11 для простого кодирования):
Менее интуитивно, но вы можете легко обернуть
std::transform
вызов в функцию, которая вернет новый контейнер (сmove
семантикой для лучшей производительности).источник
std::transform
занимает два итератора, так что вы можете взять кусок контейнера (помните, что у вас есть арифметика итераторов).std::transform
как:Y<U> map(T<U>, std::function<Y(U)>)
.