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

时间:2019-11-02 07:01:26

标签: c++ c++11

我有2个整数向量。

说第一个有(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

您期望的输出是: 1

1

0

0

我需要这样:

1

0

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

任何帮助,将不胜感激!

3 个答案:

答案 0 :(得分:4)

  

我已经尝试过for循环,但是它是从每个元素中减去每个数字,而不是仅是第一个。

您的做法不正确。您一直在使用vector进行循环,因此要从第二vector的每个元素中减去第一个vector的每个元素。

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

一个涉及编写自己的函数以减去两个#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; } ,然后添加结果的元素。

STL

另一种方法(首选)涉及使用#include <iostream> #include <vector> #include <algorithm> #include <numeric> int main(void) { std::vector<int> a = { 2, 1 }; std::vector<int> b = { 1, 1 }; std::vector<int> result; std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), [](const auto a, const auto b) { return a - b; } ); int sumAllElements = std::accumulate(result.begin(), result.end(), 0); std::cout << "Result is " << sumAllElements << std::endl; return 0; }

lambda expression

上面的代码使用std::accumulate。要了解有关它们的更多信息,请参阅此link

containerstd::transform的所有元素求和,lambda expression对两个向量执行转换(在第五个参数中指定),并将结果放入另一个向量中。我们已使用sub执行所需的lambda操作。

编辑:

在没有function pointers的情况下实现它也很容易。您可以使用#include <iostream> #include <vector> #include <algorithm> #include <numeric> double subtract(const double a, const double b) { return a - b; } int main(void) { std::vector<int> a = { 2, 1 }; std::vector<int> b = { 1, 1 }; std::vector<int> result; std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), subtract); int sumAllElements = std::accumulate(result.begin(), result.end(), 0); std::cout << "Result is " << sumAllElements << std::endl; return 0; }

std::minus

使用lambda表达式有很多优点。

注意:

您也可以使用std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), std::minus<int>()); 来代替定义自己的函数。像这样:

class CustomListPlacesTableViewController: UIPresentationController {
    override var frameOfPresentedViewInContainerView: CGRect {
        get {
            containerView?.frame.origin.y = UIScreen.main.bounds.midY
            containerView?.backgroundColor = .black
            return super.frameOfPresentedViewInContainerView
        }
    }
}

答案 1 :(得分:3)

在C ++ 17中,您可以将std::transformstd::reduce / std::accumulate调用与std::transform_reduce组合在一起:

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

Demo

答案 2 :(得分:2)

以下是使用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;
}