C++向量减去元素

C++ vector subtract elements

本文关键字:元素 向量 C++      更新时间:2023-10-16

我有一个这样的向量:

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

如果你想使用std::transform,你可以在一行中使用类似的lambda:

std::transform(v.begin(), v.end(), v.begin(), 
  [&](float a) { static float init{v[0]}; return init - a; });

实时示例

给出的结果是

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; });
}

实时示例

给出的结果是:

0-20-380-361.8-682;20;0-360-341.8-662;380;360;0;2002年18月18日-302;361.8;341.8-2002年18月18日;0-320.2;682;662;302;320.2;0;

行为2(作为m.s.答案(

因此,我还试图重现另一种行为——注意棘手的索引部分,它不是那么优雅。。。

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; });
}

实时示例给出的结果是:

-20-380-361.8-682-360-341.8-662;2002年18月18日-302-320.2;

您可以从这里使用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;
}

视频直播

// 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);

在Coliru 上直播

看起来你想要这样的东西。定义减法函数

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