(P79)stl(七):变动性算法

文章目录

1.变动性算法

  • 变动性算法
    for_each
    copy,从头到尾拷贝
    copy_backward,从后往前拷贝
    transform,进行某种变换
    replace
    replace_copy,replace_copy在拷贝的过程中,执行某动作,原区间不改,目标区间会更改
    replace_copy_if,

  • eg:P79\01.cpp

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

void add_3(int& n)
{
    n += 3;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 5};
    vector<int> v(a, a+5);

    //使用算法
    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    //for_each是变动性还是非变动性算法,取决于第3个参数:是否更改容器中的元素
    for_each(v.begin(), v.end(), add_3);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    return 0;

}

  • 测试
    在这里插入图片描述

  • 断点:

    for_each(v.begin(), v.end(), add_3);

判断区间是否合法;
判断指针是否合法;
定义迭代器变量;
在这里插入图片描述
注意*运算符返回的是引用,引用指向容器中的某个元素,对引用进行更改能够影响到容器中的元素
在这里插入图片描述

  • eg:P79\02.cpp
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

void add_3(int& n)
{
    n += 3;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 5};
    vector<int> v(a, a+5);
    list<int> l(5);//list<int> l;错误,copy要求目标的空间已经存在

    //使用算法
    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    //for_each是变动性还是非变动性算法,取决于第3个参数:是否更改容器中的元素
    for_each(v.begin(), v.end(), add_3);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    //copy要求目标的空间已经存在
    copy(v.begin(),v.end(), l.begin());
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    return 0;

}

  • 测试:
    在这里插入图片描述

  • 断点:

    copy(v.begin(),v.end(), l.begin());

在这里插入图片描述
在这里插入图片描述

  • eg:P79\03.cpp
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

void add_3(int& n)
{
    n += 3;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 5};
    vector<int> v(a, a+5);
    list<int> l(10);//list<int> l;错误,copy要求目标的空间已经存在

    //使用算法
    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    //for_each是变动性还是非变动性算法,取决于第3个参数:是否更改容器中的元素
    for_each(v.begin(), v.end(), add_3);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    //copy要求目标的空间已经存在
    copy(v.begin(),v.end(), l.begin());
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    copy_backward(v.begin(),v.end(), l.end());
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    return 0;

}

  • 测试:
    在这里插入图片描述

  • 断点:

    copy_backward(v.begin(),v.end(), l.end());

在这里插入图片描述
在这里插入图片描述

  • eg:P79\04.cpp
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

void add_3(int& n)
{
    n += 3;
}

int fun(int n)
{
    return 2 * a;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 5};
    vector<int> v(a, a+5);
    list<int> l(5);

    //原区间不变,目标区间会变
    transform(v.begin(), v.end(), l.begin(), fun);
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    return 0;

}

4个参数的:
transform()不会用的话,vs键入F1帮助即可
从_First遍历到_Last,执行一个函数_Func,然后把它变换到目标区间中
_Func是一个一元函数,就是只接受一个参数
5个参数的:
两个区间进行某种运算,然后插入到_Result
_Func是一个二元函数
在这里插入图片描述

  • 测试:
    在这里插入图片描述
  • 断点:
transform(v.begin(), v.end(), l.begin(), fun);

在这里插入图片描述
原区间不变,目标区间会变
在这里插入图片描述

  • eg:P79\05.cpp
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout << n << ' ';
}

void add_3(int& n)
{
    n += 3;
}

int fun(int n)
{
    return 2 * n;
}

int fun2(int a, int b)
{
    return a + b;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = { 1, 2, 3, 4, 5 };
    vector<int> v(a, a + 5);
    list<int> l(5);
    list<int> l2(2);

    //原区间不变,目标区间会变
    transform(v.begin(), v.end(), l.begin(), fun);
    for_each(l.begin(), l.end(), print_element);
    cout << endl;

    //第一个区间元素:1,2
    //第二个区间元素:4,5
    transform(v.begin(), v.begin() + 2, v.begin() + 3, l2.begin(),fun2);
    for_each(l2.begin(), l2.end(), print_element);
    cout << endl;

    return 0;

}


  • 测试:
    在这里插入图片描述

  • eg:P79\06.cpp

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 3};
    vector<int> v(a, a+5);

    //把元素为3的替换成13
    replace(v.begin(), v.end(), 3, 13);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;
    return 0;

}

  • 测试:
    在这里插入图片描述

  • eg:P79\07.cpp

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 3};
    vector<int> v(a, a+5);
    list<int> l(5);

    //把元素为3的替换成13
    replace(v.begin(), v.end(), 3, 13);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    //replace_copy原区间不改,目标区间会更改
    replace_copy(v.begin(), v.end(), l.begin(), 13, 3);
    for_each(v.begin(), v.end(), print_element);
    cout<<endl;
    
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    return 0;

}

  • 测试:
    在这里插入图片描述

  • eg:P79\08.cpp

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

void print_element(int n)
{
    cout <<n<<' ';
}

bool func(int n)
{
    return n < 10;
}

int main(void)
{
    //容器在构造的时候可以不传递参数,也可以传递2个参数,容器中的区间都是是一个闭开区间[)
    //所有STL区间都是闭开区间
    //end应该指向5后面的位置,那么begin就指向1
    //a,a+5迭代器,这俩迭代器实现的方式是类,其内部持有了int*,所以本质上类型是int*
    int a[] = {1, 2, 3, 4, 3};
    vector<int> v(a, a+5);
    list<int> l(5);

    //把元素为3的替换成13
    replace(v.begin(), v.end(), 3, 13);

    for_each(v.begin(), v.end(), print_element);
    cout<<endl;

    //replace_copy原区间不改,目标区间会更改
    replace_copy(v.begin(), v.end(), l.begin(), 13, 3);
    for_each(v.begin(), v.end(), print_element);
    cout<<endl;
    
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    //拷贝的过程中根据某个条件来替换
    //<10的元素都替换为0
    replace_copy_if(v.begin(), v.end(), l.begin(), func, 0);
    for_each(l.begin(), l.end(), print_element);
    cout<<endl;

    return 0;

}

  • 测试:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值