如何从另一个向量中的另一个第一元素减去向量中的第一元素
How to Subtract the first element in a vector from another first element in another vector?
我有两个int向量。
假设第一个有(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加在一起。
如有任何帮助,将不胜感激!
我尝试过for循环,但它从每个元素中减去每个数字,而不是只减去第一个。
你做这件事的方式不对。您已经将cascaded
用于循环,因此,您将从第二个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
对container
和std::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;
}
使用lambda表达式有多种优点。
注意:
您也可以使用std::minus
,而不是定义自己的函数。像这样:
std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), std::minus<int>());
在C++17中,您可以将std::transform
和std::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<>());
演示
下面是一个使用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;
}
- 使用std::transform将一个范围的元素添加到另一个范围中
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何从一个容器中获取某些元素并将其转换插入到另一个容器中?
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何从一个向量中删除最小元素并添加到另一个向量,而第一个变为空?
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 从另一个向量中搜索和找到元素的有效方法
- 如果在C 中已经回荡了另一个相同值的阵列元素,请防止循环回荡
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 如何将元素添加到从另一个线程绑定到 XAML 的 IVector
- 使用对另一个元组不同类型的元素的非常量引用来初始化元组的元素
- 并行算法将向量的元素分配到另一个元素的元素
- C 初始化矢量每个元素,带有另一个向量的参数
- 模板函数,它使用 n_copy 复制前 n 个元素形成一个向量,另一个向量导致编译错误
- 递增迭代器以指向另一个迭代器的下一个元素
- 如何转换一个类方法以修改另一个类的私有元素?
- 将映射从第二个元素复制到另一个地图
- 使用擦除-删除范例将元素从一个向量移动到另一个向量