• C++核心编程:P19->STL----常用算法(下)


    本系列文章为黑马程序员C++教程学习笔记,前面的系列文章链接如下
    C++核心编程:P1->程序的内存模型
    C++核心编程:P2->引用
    C++核心编程:P3->函数提高
    C++核心编程:P4->类和对象----封装
    C++核心编程:P5->类和对象----对象的初始化和清理
    C++核心编程:P6->类和对象----C++对象模型和this指针
    C++核心编程:P7->类和对象----友元
    C++核心编程:P8->类和对象----运算符重载
    C++核心编程:P9->类和对象----继承
    C++核心编程:P10->类和对象----多态
    C++核心编程:P11->文件操作
    C++核心编程:P12->模板----函数模板
    C++核心编程:P13->模板----类模板
    C++核心编程:P14->STL----STL初识
    C++核心编程:P15->STL----常用容器(上)
    C++核心编程:P16->STL----常用容器(下)
    C++核心编程:P17->STL----函数对象
    C++核心编程:P18->STL----常用算法(上)


    一、常用拷贝和替换算法

    学习目标: 掌握常用的拷贝和替换算法
    算法简介:
    copy // 容器内指定范围的元素拷贝到另一容器中
    replace // 将容器内指定范围的旧元素修改为新元素
    replace_if // 容器内指定范围满足条件的元素替换为新元素
    swap // 互换两个容器的元素


    1.1 copy

    功能描述: 容器内指定范围的元素拷贝到另一容器中
    函数原型:copy(iterator beg, iterator end, iterator dest);
    按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    beg:开始迭代器
    end:结束迭代器
    dest:目标起始迭代器


    案例: 测试copy的功能

    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrints
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    	vector<int> v1;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i + 1);
    	}
    	vector<int> v2;
    	v2.resize(v1.size());
    	copy(v1.begin(), v1.end(), v2.begin());
    
    	for_each(v2.begin(), v2.end(), myPrints());
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    运行,效果如下。
    在这里插入图片描述


    1.2 replace

    功能描述: 将容器内指定范围的旧元素修改为新元素
    函数原型: replace(iterator beg, iterator end, oldvalue, newvalue);
    将区间内旧元素 替换成 新元素
    beg 开始迭代器
    end结束迭代器
    oldvalue旧元素
    newvalue新元素


    案例: 测试copy的功能

    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    	vector<int> v;
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(50);
    	v.push_back(20);
    	v.push_back(40);
    	v.push_back(70);
    
    	for_each(v.begin(), v.end(), myPrint());
    	cout << endl;
    	replace(v.begin(), v.end(), 20, 2000);
    	for_each(v.begin(), v.end(), myPrint());
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    运行,效果如下。
    在这里插入图片描述


    1.3 replace_if

    功能描述: 将区间内满足条件的元素,替换成指定元素
    函数原型:replace_if(iterator beg, iterator end, _pred, newvalue);
    按条件替换元素,满足条件的替换成指定元素
    beg:开始迭代器
    end:结束迭代器
    _pred:谓词
    newvalue:替换的新元素


    案例: 测试replace_if的功能

    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    class Greater30
    {
    public:
    	bool operator()(int val)
    	{
    		return val >= 30;
    	}
    };
    
    void test01()
    {
    	vector<int> v;
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(50);
    	v.push_back(20);
    	v.push_back(40);
    	v.push_back(70);
    
    	//把大于等于30的替换为3000
    	for_each(v.begin(), v.end(), myPrint());
    	cout << endl;
    	replace_if(v.begin(), v.end(), Greater30(), 3000);
    	for_each(v.begin(), v.end(), myPrint());
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    运行,效果如下。
    在这里插入图片描述


    1.4 swap

    功能描述: 互换两个容器的元素
    函数原型:swap(container c1, container c2);
    互换两个容器的元素
    c1:容器1
    c2:容器2


    案例: 测试swap的功能

    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    	vector<int> v1;
    	vector<int> v2;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    		v2.push_back(i + 100);
    	}
    
    	cout << "交换前: " << endl;
    	for_each(v1.begin(), v1.end(), myPrint());
    	cout << endl;
    	for_each(v2.begin(), v2.end(), myPrint());
    	cout << endl;
    
    	cout << "交换后: " << endl;
    	swap(v1, v2);
    	for_each(v1.begin(), v1.end(), myPrint());
    	cout << endl;
    	for_each(v2.begin(), v2.end(), myPrint());
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    运行,效果如下。
    在这里插入图片描述


    二、常用算术生成算法

    学习目标: 掌握常用的算术生成算法
    注意: 算术生成算法属于小型算法,使用时包含的头文件为 #include
    算法简介:
    accumulate // 计算容器元素累计总和
    fill // 向容器中添加元素


    2.1 accumulate

    功能描述: 计算区间内容器元素累计总和
    函数原型:accumulate(iterator beg, iterator end, value);
    计算容器元素累计总和
    beg:开始迭代器
    end:结束迭代器
    value:起始值(起始的累加值,将后续所有的值都加到这里)


    案例: 测试accumulate的功能

    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    	vector<int> v;
    	for (int i = 0; i <= 100; i++) {
    		v.push_back(i);
    	}
    
    	int a = accumulate(v.begin(), v.end(), 0);
    	int b = accumulate(v.begin(), v.end(), 1000);
    
    	cout << "a = " << a << ", b = " << b << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    运行,效果如下。
    在这里插入图片描述


    2.2 fill

    功能描述: 向容器中填充指定的元素
    函数原型:fill(iterator beg, iterator end, value);
    向容器中填充元素
    beg:开始迭代器
    end:结束迭代器
    value:填充的值


    案例: 测试fill的功能

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    
    	vector<int> v;
    	v.resize(10);
    	//填充
    	fill(v.begin(), v.end(), 100);
    
    	for_each(v.begin(), v.end(), myPrint());
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    运行,效果如下。
    在这里插入图片描述


    三、常用集合算法

    学习目标: 掌握常用的集合算法
    算法简介:
    set_intersection // 求两个容器的交集
    set_union // 求两个容器的并集
    set_difference // 求两个容器的差集


    3.1 set_intersection

    功能描述: 求两个容器的交集
    函数原型: set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    求两个集合的交集。注意,两个集合必须是有序序列
    beg1:容器1开始迭代器
    end1:容器1结束迭代器
    beg2:容器2开始迭代器
    end2:容器2结束迭代器
    dest:目标容器开始迭代器


    案例: 测试set_intersection的功能

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int> v1;
    	vector<int> v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i+5);
    	}
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	vector<int> v3;
    	//容器大小为这两个容器中最小的那个
    	v3.resize(min(v1.size(), v2.size()));
    	vector<int>::iterator End = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    	for_each(v3.begin(), End, myPrint);
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行,效果如下。
    在这里插入图片描述


    3.2 set_intersection

    功能描述: 求两个集合的并集
    函数原型:set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    求两个集合的并集,注意:两个集合必须是有序序列。
    beg1:容器1开始迭代器
    end1:容器1结束迭代器
    beg2:容器2开始迭代器
    end2:容器2结束迭代器
    dest:目标容器开始迭代器


    案例: 测试set_union的功能。

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int> v1;
    	vector<int> v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i+5);
    	}
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	vector<int> v3;
    	//新容器大小为之前两个容器大小之和
    	v3.resize(v1.size() + v2.size());
    	vector<int>::iterator End = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    	for_each(v3.begin(), End, myPrint);
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行,效果如下。
    在这里插入图片描述


    3.3 set_difference

    功能描述: 求两个集合的差集
    函数原型:set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    求两个集合的差集,注意:两个集合必须是有序序列。
    beg1:容器1开始迭代器
    end1:容器1结束迭代器
    beg2:容器2开始迭代器
    end2:容器2结束迭代器
    dest:目标容器开始迭代器

    差集的定义如下:
    在这里插入图片描述


    案例: 测试set_difference的功能

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int> v1;
    	vector<int> v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i+5);
    	}
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	vector<int> v3;
    	v3.resize(max(v1.size(),v2.size()));
    	//v1和v2的差集
    	vector<int>::iterator End = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    	for_each(v3.begin(), End, myPrint);
    	cout << endl;
    	//v2和v1的差集
    	End = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
    	for_each(v3.begin(), End, myPrint);
    	cout << endl;
    }
    
    int main() {
    	test01();
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    运行,效果如下。
    在这里插入图片描述

  • 相关阅读:
    黑马旅游案例
    由Redis Cluster集群引发的对几种算法的思考
    力扣2859 补9.19
    【Vue2.0源码学习】生命周期篇-初始化阶段(initState)
    Lua数据文件
    一篇文章搞懂MySQL的order by
    C及C++每日练习(1)
    快速上手Vue3
    【基于Cocos Creator 3.5的赛车游戏】8.引入触摸屏幕事件并简单的控制小车
    White Paper 4Understanding Electrical Overstress - EOS-3
  • 原文地址:https://blog.csdn.net/InnerPeaceHQ/article/details/126043113