循环向量的向量并附加到新向量

Looping over vector of vectors and appending to a new vector

本文关键字:向量 新向量 循环      更新时间:2023-10-16

我想遍历 vect,在每个元素上调用一个函数,在两个结果之间执行操作并将其附加到新向量。 有没有更好的方法可以做到这一点?

std::vector<int> vect = {{1,2},{3,4}};
std::vector<double> out(vect.size());
for (int i = 0; i < vect.size(); i++){
double v = somefunction(vect[i][0]) - somefunction(vect[i][1]);
out.push_back(v);
}

这就是std::transform可以用来做的事情。

#include <algorithm>
std::vector<double> out(vect.size());
std::transform(vect.cbegin(), vect.cend(), out.begin(), [](const auto& inner)
{ return somefunction(inner.front()) - somefunction(inner.back()); });

这假设vect是一个大小为2的容器,具有front()back()成员函数,这些函数执行人们期望它们执行的操作。

假设你的vect看起来是一个std::vector <std::vector <double>>,你可以简单地写:

std::vector <double> out;
for(size_t i = 0; i < vect.size(); ++i)
{
out.push_back(someFunction(vect[i][0]) - someFunction(vect[i][1]));
}

std::vector <double> out;
for(auto & v : vect)
{
out.push_back(someFunction(v[0]) - someFunction(v[1]));
}

您不必像以前那样初始化out因为push_back()将在您在构造中添加的内容末尾添加另一个元素。


请注意,如果vect仅包含大小为 2 的向量,则可以改用std::pair,例如:

std::vector<std::pair<double, double>> vect;

并将上一个循环替换为:

std::vector <double> out;
for(size_t i = 0; i < vect.size(); ++i)
{
out.push_back(someFunction(vect[i].first) - someFunction(vect[i].second));
}

std::vector <double> out;
for(auto & v : vect)
{
out.push_back(someFunction(v.first) - someFunction(v.second));
}