添加三个 std::vector 并将结果存储在第一个向量中

问题描述 投票:0回答:2

我有三个向量,

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 个元素。

c++
2个回答
4
投票

这比 2 次调用

std::transform
更高效:

for (size_t i = 0; i < vec1.size(); ++i) {
   vec1[i] += vec2[i] + vec3[i];
}

您可以为此编写一个算法,但标准库中没有一个可以开箱即用的算法。您可以使用一些奇怪的谓词,但这会降低可读性而不是提高可读性。

请注意,使用标准算法的主要原因不是性能。如果您查看它们的实现,您会意识到,除了使它们通用所需的所有内容之外,它们与您自己编写的循环没有什么不同。使用它们的主要优点是表达性和可读性。如果没有可用的算法可以直接完成您需要的操作,那么滥用算法会带来相反的效果:代码不可读且复杂。上面的代码确实比两次调用

std::transform
更高效。


0
投票

使用变换函数内部的 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;
}

这可能不是最好的方法,但这是为了学校作业。

© www.soinside.com 2019 - 2024. All rights reserved.