处理容器的每个成员的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)
使用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);
相关文章:
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- 是否有一种工具可以识别一组C++源文件所指的外部标识符
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 是否允许外部"C"和外部"C"外部?
- 我们是否应该在项目中包含的所有文件中声明外部变量
- 当用作模板参数时,功能指针是否需要指向具有外部链接的函数
- clang++ 是否忽略了某些弃用警告的外部"C"?
- 是否可以定义一个在外部"C"块中继承另一个结构的结构?
- g++是否将C标准库的名称声明为外部"C"链接或外部"C++"?
- 是否可以编译具有在编译时无法解析的外部依赖项的静态库?
- const 类方法是否阻止在类外部分配变量?
- Qt的GUI线程在从外部对象调用方法时是否会在引擎盖下生成线程?
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 我是否正确使用了这个类?未解析的外部符号
- 是否有相当于cmake的外部项目的qmake。
- 在没有任何外部库的情况下,是否可以在c++/linux的窗口中显示bmp图像
- 外部"C"是否应附上C++职能的声明或定义?
- 外部是否破坏封装
- 外部"C"是否会对我的代码施加限制?