处理容器的每个成员的stl函数是否可以接受外部参数

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

本文关键字:外部 是否 参数 stl 处理 成员 函数      更新时间:2023-10-16

我计划对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)

使用CCD_ 1或stl中的其他方法。我使用这些函数的困难在于,我不知道如何将外部参数包含在其中。

下面是一个使用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,它没有这样的保证(除了通过复杂性保证之外,遍历顺序和谓词的调用次数都没有):

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