繁体   English   中英

可以在容器的每个成员上使用的stl函数是否接受外部参数?

[英]Can stl functions that work on each member of a container accept external parameters?

我计划对std :: vector数组的每个数据执行一个操作,如下面的代码所示:

std::vector<int> abc;
abc.push_back(1);
abc.push_back(5);
abc.push_back(2);
std::sort(abc);
int min = abc[0];
int max = abc[2];
for(int i=0; i<3; i++)
  abc[i] = (abc[i]-min)/(max-min);

我现在的问题是,我有更优雅的表现方式

 for(int i=0; i<3; i++)
      abc[i] = (abc[i]-min)/(max-min)

在stl中使用for_each , trasnform或其他方法 我对这些功能的困难在于我不知道如何在其中加入外部参数。

这是一个使用for_each更新abc每个元素的示例:

std::for_each(abc.begin(),    // Start of range
              abc.end(),      // End of range
              [=](int &value) // The operation to apply
              {
                value=(value-min)/(max-min);
              });

尽管for_each保证了遍历的顺序以及每个元素发生了多少次调用,但更改for_each迭代的序列通常是不受欢迎的。 但是,为了安抚反对者,您可能希望使用transform而不具有这样的保证(除了通过复杂性保证之外,既没有遍历顺序也没有谓词的调用次数{注意:复杂性已被修改为保证C ++ 11中的调用次数,见25.3.4.4}):

std::transform(abc.begin(),    // Start of source range
               abc.end(),      // End of source range
               abc.begin(),    // Start of destination range
               [=](int value)  // The operation to apply
               {
                 return (value-min)/(max-min);
               });

顺便说一句,既然你在公式中进行整数除法,你必须非常小心截断结果。 你应该检查除以零。

使用C ++ 11,您可以使用捕获所需变量的lambda:

std::transform(std::begin(abc), std::end(abc),
               std::begin(abc),
               [=](int x) { return (x-min)/(max-min); });

这相当于你的循环,尽管你可能想要首先验证逻辑是否正确。

使用std::transform和合适的函子很容易实现。 这里,lambda用于简洁:

std::transform(std::begin(abc), 
               std::end(abc),
               std::begin(abc), 
               [&](int i) { return (i-min)/(max-min); }); 

目前尚不清楚这是否有所改善。 我只想写一个基于范围的简单循环:

for(int& i : abc)
  i = (i-min)/(max-min);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM