【问题标题】:How to use transform with vectors of pairs in c++如何在c ++中使用对向量进行变换
【发布时间】:2018-06-13 15:39:48
【问题描述】:

我想要一些关于如何对成对向量使用变换的帮助。我浏览了以前的答案,但没有找到我想要的东西。在下面的代码中,我将成对向量的第一个元素除以一个常数,然后将第一个和第二个元素都转移到一个新的成对向量中。该代码运行良好,但我想学习如何将转换与 lambda 函数一起使用。我无法编写 lambda 函数。专家的任何帮助将不胜感激,在此先感谢。

template<typename T, typename U>
void GraphSigm<T,U>::doTransform()
{
    sort(v1.begin(), v1.end());
    typename std::vector<std::pair<U,U>>::const_iterator it0, it1;
    it0 = v1.begin();
    it1 = v1.end() - 1;
    U maxVal = myMax(fabs((*it0).first), fabs((*it1).first));
    for (auto i : v1) {
        U a = i.first / maxVal;
        U b = i.second;
        v2.push_back(std::make_pair(a, b));
    }
}

【问题讨论】:

  • 你已经尝试过什么?出了什么问题?

标签: c++ transform


【解决方案1】:

假设您想转换一个由int 组成的向量,使得每个数字都增加 2。

您可以为此使用std::transform + lambda 函数:

std::vector<int> my_vec = {1,2,3};
std::vector<int> res_vec;
std::transform(my_vec.begin(), my_vec.end(), std::back_inserter(res_vec), [](int x){ return x+2;} );

【讨论】:

  • 您可能想要捕获局部变量,即使用[=][&amp;] 而不是[]。这将使 lambda 函数更有用(例如添加 2 以外的值)。
  • 您可能想先reserve res_vec 上的一些容量。但除此之外,我认为这是一个很好的答案,它显示了没有勺子喂养的技术。
  • 这是我能做到的,但它不起作用;我不知道如何处理修改对: v2.reserve(v1.size()); std::transform(v1.begin(), v1.end(), std::back_inserter(v2), [&](const std::pair &p){ v2.push_back(std::make_pair (p.first/maxVal, log10(p.second)));});
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 2020-10-30
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多