lambda表示法使得stl算法更易于访问.我仍然在学习什么时候它有用以及何时回归到老式的for-loops.通常,有必要迭代两个(或更多)相同大小的容器,使得相应的元素是相关的,但由于某种原因不会被打包到同一个类中.
使用for循环实现的函数如下所示:
template<typename Data, typename Property>
void foo(vector<Data>& data, vector<Property>& prop) {
auto i_data = begin(data);
auto i_prop = begin(prop);
for (; i_data != data.end(); ++i_data, ++i_prop) {
if (i_prop->SomePropertySatistfied()) {
i_data->DoSomething();
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了使用for_each,我需要一个处理多个范围的版本; 就像是:
template<typename InputIter1, typename InputIter2, typename Function>
Function for_each_on_two_ranges(InputIter1 first1, InputIter1 last1, InputIter2 first2, Function f) {
for (; first1 != last1; ++first1, ++first2) {
f(*first1, *first2);
}
return f;
}
Run Code Online (Sandbox Code Playgroud)
使用此版本,上面的代码如下所示:
template<typename Data, typename Property>
void foo_two_ranges(vector<Data>& data, vector<Property>& prop) {
for_each_on_two_ranges(begin(data), end(data), …Run Code Online (Sandbox Code Playgroud) 我最近发现了优秀的库boost :: accumulators,我想用它来代替我积累统计数据的一些代码.
我在文档中找不到的一件事是能够对两个累加器集合求和,如operator + =
例:
using namespace boost::accumulators;
typedef accumulator_set<double, features<tag::variance> > AccumSet;
class Foo {
AccumSet acc;
public:
Foo& operator+=(const Foo& that) {
this->acc += that.acc; // error! no such operator
return *this;
}
double GetVariance() { return variance(acc); }
};
Run Code Online (Sandbox Code Playgroud)
如何使用可用的API实现此目的?我不知道这是否可以实现库中所有类型的累加器(可能不是尾部),但它肯定可以用于重要的事情,如计数,总和,平均值,时刻,协方差等
我正在编写一个模板算法,它使用boost :: accumulators和Eigen线性代数库.在编译时,可视化工作室编译器(cl.exe),内存消耗达到超过2.5GB的RAM,而我的PC(Windows 7 32位,3GB虚拟地址空间)变得无响应(相当长的时间:~1分钟) .这些编译单元的二进制文件(.obj)为10-20MB.
我的问题(不针对这些特定的库)