变换-一种变异序列算法
Transform - a mutating sequence algorithm
我知道C++中的transform
算法是mutating sequence algorithm
。但我从未见过有人使用transform
来突变序列。每当我在互联网上搜索样本代码时,我得到的是类似于for_each
算法的转换算法。
请提供一个链接或例子,让我了解mutating sequence
的性质。
编辑:当我回答这个SO问题时,我更加困惑了。它说CCD_ 6是CCD_。因此我可以用for_each
修改元素,而不是修改容器的结构。提供的答案是否不正确。如果for_each
也可以修改元素,我们可以用transform
代替for_each
,并且不需要for_each
算法,只是它的实现可能很简单。
突变序列算法意味着算法将更改(修改)其工作的容器。在下面的示例中,类型为std::vector
的容器foo
被修改。
std::string s("hello");
std::vector<int> foo;
std::transform(s.begin(), s.end(), back_inserter(foo), ::toupper);
std::cout << std::string(foo.begin(), foo.end());
输出为"HELLO"
这在std::for_each
中是不可能的
是的,提供的答案对我来说听起来是正确的。还要查看C++中的非修改序列算法和突变序列算法列表,以验证您的断言。
下面是一个简单的示例
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
std::transform( std::begin( a ), std::end( a ), std::begin( a ),
[]( int x ) { return x * x; } );
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
输出为
1 2 3 4 5 6 7 8 9 10
1 4 9 16 25 36 49 64 81 100
同样可以使用算法std::for_each
来完成
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
std::for_each( std::begin( a ), std::end( a ),
[]( int &x ) { x = x * x; } );
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
尽管std::for_each
被认为是一种不可变的算法,但在其描述中,有写
2效果:将f应用于中取消引用每个迭代器的结果范围[第一个,最后一个),从第一个开始,一直到最后一个-1.[注意:如果first的类型满足可变迭代器的要求,f可以通过取消引用的迭代器--尾注]
所以事实上,它可以作为一个可变的算法使用。
std::for_each
和std::transform
这两种算法都属于非修改序列运算的范畴,因为它们不会改变源序列元素的顺序。。
似乎混合了两个概念:可变算法和非修改序列算法。:)
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- 采用测试和变异函数的STL算法
- 变换-一种变异序列算法
- 提升multi_index_container、范围变异算法和恒常性