我很喜歡用C++ 11,並試圖想出一個更優雅的方式來對兩個std::vector<double>
進行兩兩比較。對於成對最大,我使用的是相當不雅使用C++ 11 std :: vector元素進行兩兩比較lambda表達式
typedef std::vector<double> vec;
vec pairwiseMax(vec& a, vec& b)
{
ASSERT(a.size() == b.size());
vec c(a); // seed with a
for (unsigned int i = 0; i < a.size(); i++)
{
if (b[i] > a[i]) // bigger than
c[i] = b[i];
}
return c;
}
但是,使用lambda表達式和std::for_each
似乎更好,因爲其中提取std::vector<double>
的絕對最大下面,但我不來了什麼。
inline double vecabs(vec v)
{
if (v.empty()) return 0.0;
vec::iterator it =
std::max_element(v.begin(), v.end(),
// Start lambda function
[](double const& a, double const& b)
{
return (std::abs(a) < std::abs(b));
});
return *it;
};
伊戈爾的文章後,我現在有:
vec c;
c.reserve(a.size());
std::transform(a.begin(), a.end(), b.begin(),
std::back_inserter(c),
[](double const& d, double const& e)
{ return max(d, e); });
兩個問題:
- 爲什麼不直接複製到
vec a
像vec c
我以前? - 是不是使用back_inserter添加了很多額外的操作?如果從
c==a
開始,那麼將需要更少的插入到c
。
像這樣:
vec c(a); // seed with a
std::transform(a.begin(), a.end(), b.begin(),
c.begin(),
[](double const& d, double const& e)
{ return max(d, e); });
return c;
伊戈爾的方法更高效那麼你原來的方法。如果a和b包含均勻分佈的隨機值,那麼您的原始方法將創建1.5 N個副本,但Igor的方法僅創建1 N個副本。 – atb