C ++向量减法元素

时间:2015-08-06 08:33:10

标签: c++ vector

我有这样的矢量:

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解决此问题?或者以其他方式解决此问题,越简单越好。

4 个答案:

答案 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;
}

live on ideone

答案 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);

Live on Coliru

答案 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 >而不是自己的减法