变换-一种变异序列算法

Transform - a mutating sequence algorithm

本文关键字:变异 算法 一种 变换      更新时间:2023-10-16

我知道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_eachstd::transform这两种算法都属于非修改序列运算的范畴,因为它们不会改变源序列元素的顺序。。

似乎混合了两个概念:可变算法和非修改序列算法。:)