如何链接C++“转换”和“inner_product”调用
How to chain C++ `transform` and `inner_product` calls?
我想做这样的事情:
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()
用于first
,last
迭代器并链接结果。
有什么东西(例如一些库(可以允许这样做吗?
只需编写自己的类来增强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 上(
你没有被束缚在面向对象的编程上!
相关文章:
- 堆叠协程 + gdb = "previous frame inner to this frame (corrupt stack)?"
- g++:错误:/u01/app/orace/product/11.2.0/xe/lib/lclasses12.zip:此
- 如何为 Product* getProductFromID(std::string)编写方法定义;.
- OpenCV GpuMat dot product
- 如何从C 中的Inner Union访问类成员
- 在带有'-(inner expression)'的表达式两边添加括号
- 没有从'w9::Product *'到'w9::List<w9::Product>'的可行转换
- 用于矩阵-向量wise product操作的Eigen3 replicate()
- 由于在序列点之间修改变量两次而导致的 UB 是否会转移到"inner"范围?
- 在作曲的情况下访问'inner'类
- .dot() product for VectorXcd in Eigen c++
- C++多维地图:如何访问'inner'地图?
- 成员函数Outer::f()不是类Outer::Inner的友类.为什么
- sparse sparse product A^T*A optim in Eigen lib