遍历向量的向量并附加到新向量

时间:2019-08-13 11:27:16

标签: c++ stl

我想遍历vect,在每个元素上调用一个函数,在两个结果之间执行一个运算,并将其附加到一个新的vector上。 有更好的方法吗?

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

2 个答案:

答案 0 :(得分:5)

这就是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()个成员函数,它们会执行人们期望的操作。

答案 1 :(得分:1)

假设您的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));
}