如何链接C++“转换”和“inner_product”调用

How to chain C++ `transform` and `inner_product` calls?

本文关键字:inner product 调用 何链接 转换 链接 C++      更新时间:2023-10-16

我想做这样的事情:

vector<int> v;
v.push_back(0);
v.push_back(1);
v
    .transform([](auto i) { return i + 2; })
    .transform([](auto i) { return i * 3; })
    .inner_product(0);

换句话说,只需隐式使用 begin()end() 用于firstlast迭代器并链接结果。

有什么东西(例如一些库(可以允许这样做吗?

只需编写自己的类来增强std::vector

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
#include <utility>
template < typename T >
class augmented_vector
{
  std::vector < T > m_vec;
public:
  augmented_vector() : m_vec() {}
  explicit augmented_vector(std::vector<T> const& in) : m_vec(in) {}
  void push_back ( T&& value )
  {
    m_vec.push_back(std::forward<T>(value));
  }
  template < typename F >
  augmented_vector < T > transform(F const& f)
  {
    std::vector < T > new_vec(m_vec.size());
    std::transform( m_vec.begin(), m_vec.end(), new_vec.begin(), f);
    return augmented_vector < T > ( new_vec );
  }
  T inner_product(T value)
  {
    return std::inner_product( m_vec.begin(), m_vec.end(), m_vec.begin(), value);
  }
};
int main()
{
  augmented_vector<int> v;
  v.push_back(0);
  v.push_back(1);
  auto val = v
    .transform([](auto i) { return i + 2; })
    .transform([](auto i) { return i * 3; })
    .inner_product(0);
  std::cout << val << 'n';
}

或者使用 D 编程语言。 它具有通用函数调用语法。

import std.algorithm : fold, map;
import std.stdio : writeln;
void main()
{
    auto v = [0, 1];
    auto x = v
        .map!(a => a+2)
        .map!(a => a*3)
        .fold!((a,b) => a + b^^2)(0);
    writeln(x);
}

包装函数,在包装函数中提供样板:

template<typename Container, typename Transform>
void transform_container(Container & container, Transform transform) {
  std::transform(std::begin(container), std::end(container),
                 std::begin(container), /* requires output iterator */
                 transform);
}
template<typename T, typename Container>
auto inner_product_self(Container&& container, T initial) {
  return std::inner_product(std::begin(container), std::end(container),
                            std::begin(container),
                            initial);
}

然后,您的代码将变为:

int main() {
  std::vector<int> v(2);
  std::itoa(std::begin(v), std::end(v), 0);
  transform_container(v, [](auto i) { return i + 2; });
  transform_container(v, [](auto i) { return i * 3; });
  auto result = inner_product_self(container, 0);
  std::cout << "result: " << result;
}

(活在 ideone 上(

你没有被束缚在面向对象的编程上!