我有三个向量,
vec1
、vec2
和vec3
。
我想将这三个值相加并将结果存储在 vec1 中。
我目前正在做这个,
std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec1.begin(), std::plus<double>());
std::transform(vec1.begin(), vec1.end(), vec3.begin(), vec1.begin(), std::plus<double>());
我觉得我应该能够比上面更快一点,也许在一次转换中。知道怎么做吗?
vec1
很小。通常大约 250 个元素。
这比 2 次调用
std::transform
更高效:
for (size_t i = 0; i < vec1.size(); ++i) {
vec1[i] += vec2[i] + vec3[i];
}
您可以为此编写一个算法,但标准库中没有一个可以开箱即用的算法。您可以使用一些奇怪的谓词,但这会降低可读性而不是提高可读性。
请注意,使用标准算法的主要原因不是性能。如果您查看它们的实现,您会意识到,除了使它们通用所需的所有内容之外,它们与您自己编写的循环没有什么不同。使用它们的主要优点是表达性和可读性。如果没有可用的算法可以直接完成您需要的操作,那么滥用算法会带来相反的效果:代码不可读且复杂。上面的代码确实比两次调用
std::transform
更高效。
使用变换函数内部的 lambda,我能够将三个向量加在一起,然后将它们存储在第四个向量中。请原谅任何不一致或未优化的事情,这只是我学习 C++ 的第二年。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> valuesA = { 1, 5, 2, 6, 3 };
vector<int> valuesB = { 2, 3, 1, 3, 4 };
vector<int> valuesC = { 2, 1, 5, 2, 1 };
vector<int> results(valuesA.size());
int value;
cout << "gimme a number: ";
cin >> value;
int pos = 0;
transform(valuesA.cbegin(), valuesA.cend(), results.begin(), [valuesB, valuesC, value, &pos](int valA)
{
int output = valA + valuesB.at(pos) + valuesC.at(pos) + value;
pos++;
return output;
});
for(int x = 0; x < results.size(); x++)
{
cout << results.at(x) << " ";
}
return 0;
}
这可能不是最好的方法,但这是为了学校作业。