我有这样的矢量:
std::vector<float> v {5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
我想减去所有元素:
5120.2 - 5140.2 = -20.0
5120.2 - 5500.2 = -380.0
5120.2 - 5482.0 = -358.2
5120.2 - 5802.2 = -682.0
5140.2 - 5500.2 = -360.0
5140.2 - 5482.0 = -341.8
5140.2 - 5802.2 = -562.0
5500.2 - 5482.0 = 18.0
5500.2 - 5802.0 = -301.8
5482.0 - 5802.0 = -320.0
我只需要绝对值。
如何使用std::transform
解决此问题?或者以其他方式解决此问题,越简单越好。
答案 0 :(得分:3)
您可以使用here中的combine_pairwise
:
#include <iostream>
#include <vector>
template<typename Iter, typename Func>
void combine_pairwise(Iter first, Iter last, Func func)
{
for(; first != last; ++first)
for(Iter next = std::next(first); next != last; ++next)
func(*first, *next);
}
int main() {
std::vector<float> v {5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
auto op = [&](const float&f1, const float&f2){result.push_back(f1-f2);};
combine_pairwise(v.begin(), v.end(), op);
for (auto f : result)
{
std::cout << f << std::endl;
}
return 0;
}
答案 1 :(得分:2)
如果你想使用std::transform
,你可以在一行中使用这样的lambda:
std::transform(v.begin(), v.end(), v.begin(),
[&](float a) { static float init{v[0]}; return init - a; });
<强> Live example 强>
给出的结果是
0; -20; -380; -361.8; -682;
(和5120.2-5482.0 = -361.8
...)
编辑:看到评论后,此解决方案适用于第一个元素。因此,您可以通过更改v[1],v[2],...
来重复此过程。
行为1(作为昆汀的答案)
std::vector<float> v{5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
size_t size = v.size();
for (size_t i = 0; i < size; i ++) { result.insert(result.end(), v.begin(), v.end()); }
for (size_t i = 0; i < size; i ++) {
std::transform(v.begin(), v.end(), result.begin() + i*size, [&](float a) { return v[i] - a; });
}
<强> Live example 强>
给出的结果是:
0; -20; -380; -361.8; -682; 20; 0; -360; -341.8; -662; 380; 360; 0; 18.2002; -302; 361.8; 341.8; -18.2002; 0; -320.2; 682; 662; 302; 320.2; 0;
行为2(如同应答)
所以我也尝试重现这个其他行为,注意棘手的索引部分,这不是那么优雅......
std::vector<float> v{5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
size_t size = v.size();
for (size_t i = 1; i < size; i ++) { result.insert(result.end(), v.begin() + i, v.end()); }
size_t sum = size*(size-1)/2;
for (size_t i = 0; i < size - 1; i ++) {
std::transform(v.begin() + i + 1, v.end(), result.begin() + sum - (size-i)*(size-i-1)/2, [&](float a) { return v[i] - a; });
}
<强> Live example 强> 给出的结果是:
-20; -380; -361.8; -682; -360; -341.8; -662; 18.2002; -302; -320.2;
答案 2 :(得分:2)
// New vector with enough space to hold the result
decltype(v1) v2;
v2.reserve(v.size() * v.size());
// Iterate over all possible pairs of (v × v)
auto ite = std::back_inserter(v2);
for(auto i1 : v)
for(auto i2 : v)
*ite++ = i1 - i2;
// Put the results back in v and let v2 die
swap(v, v2);
答案 3 :(得分:1)
好像你想要这样的东西。 定义减法函数
float subtract(float first, float second)
{
return first - second;
}
然后你想要进行转换:
std::transform (v.begin(), --v.end(), ++v.begin(), result_vector.begin(), subtract);
如果使用C ++ 14,您可以使用std::minus< float >而不是自己的减法