C++ 如何从另一个向量中的第一个元素减去向量中的第一个元素?

C++ 如何从另一个向量中的第一个元素减去向量中的第一个元素?,c++,c++11,C++,C++11,我有两个整数向量 假设第一个有2,1。 第二个是1,1 我试着减去这样的数字: 2-1,, 1-1 然后我需要加上这两个数字,最后的答案是1 我尝试了一个for循环,但它是从每个元素中减去每个数字,而不是只减去第一个 这就是我到目前为止所尝试的 vector<int> temp; for(unsigned i =0; i < Vec1.size(); i++) for(unsigned o =0; o < Vec2.size(); o++) temp.push_

我有两个整数向量

假设第一个有2,1。 第二个是1,1

我试着减去这样的数字:

2-1,, 1-1

然后我需要加上这两个数字,最后的答案是1

我尝试了一个for循环,但它是从每个元素中减去每个数字,而不是只减去第一个

这就是我到目前为止所尝试的

vector<int> temp;

for(unsigned i =0; i < Vec1.size(); i++)
 for(unsigned o =0; o < Vec2.size(); o++)
   temp.push_back(Vec1.at(i).nums- Vec2.at(o).nums);

//where nums, are just the numbers showed above

您预期的输出是: 一,

一,

0

0

我需要的是:

一,

0

然后我可以做一个for循环,把所有的int加在一起


如有任何帮助,将不胜感激

以下是使用STL的示例:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> vec1 {2, 1};
    std::vector<int> vec2 {1, 1};
    std::vector<int> temp;
    std::transform(begin(vec1), std::end(vec1), std::begin(vec2),
        std::back_inserter(temp), [](const auto a, const auto b) {return a - b;});
    auto sum = std::accumulate(temp.begin(), temp.end(), 0);
    std::cout << "Result: " << sum << "\n";
    return 0;
}

以下是使用STL的示例:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> vec1 {2, 1};
    std::vector<int> vec2 {1, 1};
    std::vector<int> temp;
    std::transform(begin(vec1), std::end(vec1), std::begin(vec2),
        std::back_inserter(temp), [](const auto a, const auto b) {return a - b;});
    auto sum = std::accumulate(temp.begin(), temp.end(), 0);
    std::cout << "Result: " << sum << "\n";
    return 0;
}
我尝试了一个for循环,但它是从每个元素中减去每个数字,而不是只减去第一个

你做得不对。您一直在使用级联for循环,因此,从第二个向量的每个元素中减去第一个向量的每个元素

有两种方法可以正确实施:

一种是编写自己的函数,将两个向量相减,然后将结果的元素相加

#include <iostream>
#include <vector>


std::vector<int> subtract(const std::vector<int>& a, const std::vector<int>& b)
{
    std::vector<int> result;
    const int SIZE = std::min(a.size(), b.size());

    for (int i = 0; i < SIZE; i++)
        result.push_back(a[i] - b[i]);

    return result;
}


int addAllElements(const std::vector<int>& a)
{
    int result = 0;
    for (auto i: a)
        result += i;
    return result;
}


int main(void)
{
    std::vector<int> a = {2, 1};
    std::vector<int> b = {1, 1};

    std::cout << "Result is " << addAllElements(subtract(a, b)) << std::endl;

    return 0;
}
上面的代码使用lambda表达式。要了解更多关于它们的信息,请参见此

累加对容器的所有元素求和,std::transform对两个向量执行其第五个参数中指定的转换,并将结果放入另一个向量中。我们已经使用lambda表达式来执行所需的子操作

编辑:

在没有lambda的情况下实现它也很容易。您可以使用函数指针

我尝试了一个for循环,但它是从每个元素中减去每个数字,而不是只减去第一个

你做得不对。您一直在使用级联for循环,因此,从第二个向量的每个元素中减去第一个向量的每个元素

有两种方法可以正确实施:

一种是编写自己的函数,将两个向量相减,然后将结果的元素相加

#include <iostream>
#include <vector>


std::vector<int> subtract(const std::vector<int>& a, const std::vector<int>& b)
{
    std::vector<int> result;
    const int SIZE = std::min(a.size(), b.size());

    for (int i = 0; i < SIZE; i++)
        result.push_back(a[i] - b[i]);

    return result;
}


int addAllElements(const std::vector<int>& a)
{
    int result = 0;
    for (auto i: a)
        result += i;
    return result;
}


int main(void)
{
    std::vector<int> a = {2, 1};
    std::vector<int> b = {1, 1};

    std::cout << "Result is " << addAllElements(subtract(a, b)) << std::endl;

    return 0;
}
上面的代码使用lambda表达式。要了解更多关于它们的信息,请参见此

累加对容器的所有元素求和,std::transform对两个向量执行其第五个参数中指定的转换,并将结果放入另一个向量中。我们已经使用lambda表达式来执行所需的子操作

编辑:

在没有lambda的情况下实现它也很容易。您可以使用函数指针

在C++17中,可以将std::transform和std::reduce/std::acculate调用与以下内容结合使用:

在C++17中,可以将std::transform和std::reduce/std::acculate调用与以下内容结合使用:



如果您在这里需要另一个数据结构,您可以像result+=Vec1.ati.nums-Vec2.ato一样一次性完成。nums@roottraveller这将输出2,应该只有1,我的问题是,每个元素都会从向量2中的其他元素中减去,我只想让它从Vec2.idt中减去第一个元素,你需要另一个数据结构,你可以用一个go-like-result+=Vec1.ati.nums-Vec2.ato来完成。nums@roottraveller这将输出2,应该只有1,我的问题是,每个元素都会从向量2中的其他元素中减去,我只想从Vec2中减去第一个元素。这很有效,你能解释一下你的代码吗?非常感谢@拥抱不客气,你想知道关于代码的什么?这一部分请[]常量自动a,常量自动b{返回a-b;};这是一个匿名lambda函数,请参阅以获取介绍lambda可以被标准std::减号{}或常规自定义functor替换。这很有效,请您解释一下您的代码好吗?非常感谢@拥抱不客气,你想知道关于代码的什么?这一部分请[]常量自动a,常量自动b{返回a-b;};这称为匿名lambda函数,请参阅以获取介绍lambda可以被标准std::减号{}或常规自定义functor替换。我很高兴。请参阅我编辑的答案。它指出了代码中的错误!如果没有Lambda表达式,你会怎么做呢?这里有C++14而不是减法,这是我的。请参阅我编辑的答案。它指出了代码中的错误!如果没有Lambda表达式,你会怎么做呢?这里有C++14而不是减法
std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), std::minus<int>());
const std::vector<int> vec1 {2, 1};
const std::vector<int> vec2 {1, 1};
auto res = std::transform_reduce(vec1.begin(), vec1.end(),
                                 vec2.begin(),
                                 0,
                                 std::plus<>(),
                                 std::minus<>());