C++学习笔记(三十一)

在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十一篇博客。

本篇博客介绍了C++的常用排序算法,常用拷贝和替换算法,常用算数生成算法,常用集合算法。

本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

目录

常用排序算法

sort

random_shuffle

merge

reverse

常用拷贝和替换算法

copy

replace

replace_if

swap

常用算数生成算法

accumulate

fill

常用集合算法

set_intersection

set_union

set_difference


常用排序算法

使用排序算法需要包含头文件algorithm

sort

sort对容器内元素进行排序。函数原型是:

sort(iterator beg,iterator end,pred)

beg是开始位置,end是结束位置,pred是谓词。

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}

int main(void)
{
	vector<int> v;
	v.push_back(20);
	v.push_back(50);
	v.push_back(40);
	v.push_back(10);
	v.push_back(30);
	sort(v.begin(), v.end());
	for_each(v.begin(), v.end(), print);
	cout << endl;

	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

10   20   30   40   50
50   40   30   20   10

random_shuffle

random_shuffle进行洗牌,将指定范围内的元素随机调整次序。函数的原型是:

random_shuffle(iterator beg,iterator end)

将beg到end的元素进行洗牌。为了完全打乱,并使得顺序更随机,需要加入随机数种子。

#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}

int main(void)
{
	srand((unsigned int)time(NULL));
	vector<int> v;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v.push_back(i);
	}
	for_each(v.begin(), v.end(), print);
	cout << endl;
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
8   4   2   5   10   7   3   1   6   9

merge

merge将两个容器元素合并,并存储到另一个容器中,两个容器必须是有序的。函数原型是:

merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

beg1是第一个容器的开始位置,end1是第一个容器的结束位置。beg2是第二个容器的开始位置,end2是第二个容器的结束位置。dest是目的容器的开始位置(目的容器需要预留足够的空间)。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num) {
	cout << num << "   ";
}

int main(void)
{
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;

	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	for_each(v1.begin(), v1.end(), print);
	cout << endl;
	for_each(v2.begin(), v2.end(), print);
	cout << endl;
	v3.resize(v1.size() + v2.size());

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), v3.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
6   7   8   9   10   11   12   13   14   15
1   2   3   4   5   6   6   7   7   8   8   9   9   10   10   11   12   13   14   15

reverse

reverse将容器内的元素进行反转。函数原型是:

reverse(iterator beg,iterator end)

beg是开始迭代器,end是结束迭代器。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num) {
	cout << num << "   ";
}
int main(void)
{
	vector<int> v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	for_each(v.begin(), v.end(), print);
	cout << endl;
	reverse(v.begin(), v.end());
	for_each(v.begin(), v.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

10   30   50   20   40
40   20   50   30   10
 

常用拷贝和替换算法

使用这些算法需要包含头文件algorithm

copy

copy将容器内指定范围的元素拷贝到另一个容器中。函数原型是:

copy(iterator beg,iterator end,iterator dest)

beg是源容器开始位置,end是源容器结束位置,dest是目标开始地址。同样需要提前分配空间。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}
int main(void)
{
	vector<int> v1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
	}
	vector<int> v2;
	v2.resize(v1.size());
	copy(v1.begin(), v1.end(), v2.begin());
	for_each(v2.begin(), v2.end(), print);
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10

replace

replace将容器内指定范围的旧元素修改为新元素。函数原型是:

replace(iterator beg,iterator end,oldvalue,newvalue)

beg是开始位置,end是结束位置,oldvalue是旧元素,newvalue是新元素。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}
int main(void)
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(20);
	v.push_back(20);
	v.push_back(50);
	for_each(v.begin(), v.end(), print);
	cout << endl;

	replace(v.begin(), v.end(), 20, 25);
	for_each(v.begin(), v.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

10   20   30   40   20   20   50
10   25   30   40   25   25   50

程序将20换成了25。

replace_if

replace_if将区间内满足条件的元素替换成指定元素。函数原型是:

replace_if(iterator beg,iterator end,pred,newvalue)

beg是开始位置,end是结束位置,pred是一个谓词,newvalue是新元素。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num) 
{
	cout << num << "   ";
}

class compare
{
public:
	bool operator() (int num) {
		return num > 30;
	}
};

int main(void)
{
	vector<int> v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	v.push_back(60);
	v.push_back(10);

	for_each(v.begin(), v.end(), print);
	cout << endl;
	replace_if(v.begin(), v.end(), compare(), 55);
	for_each(v.begin(), v.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

20   30   40   50   60   10
20   30   55   55   55   10

程序将大于30的元素全部换为55。

swap

swap互换两个容器的元素。函数原型是:

swap(container c1,container c2)

交换c1和c2的元素。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}

int main(void)
{
	vector<int> v1;
	vector<int> v2;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
		v2.push_back(i + 100);
	}

	for_each(v1.begin(), v1.end(), print);
	cout << endl;
	for_each(v2.begin(), v2.end(), print);
	cout << endl;

	swap(v1,v2);
	for_each(v1.begin(), v1.end(), print);
	cout << endl;
	for_each(v2.begin(), v2.end(), print);
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
101   102   103   104   105   106   107   108   109   110
101   102   103   104   105   106   107   108   109   110
1   2   3   4   5   6   7   8   9   10

常用算数生成算法

常用算数生成算法使用时包含的头文件是numeric

accumulate

accumulate计算区间内容器元素累计总和。函数原型是:

accumulate(iterator beg,iterator end,value)

beg是起始位置,end是结束位置,value是起始值。

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
int main(void)
{
	vector<int> v;
	int i;
	for (i = 1; i <= 100; i += 1) {
		v.push_back(i);
	}
	cout << accumulate(v.begin(), v.end(), 0) << endl;
	return 0;
}

这段程序进行相加时从0开始。程序的输出是:

5050

fill

fill向容器中填充指定的元素,函数原型是:

fill(iterator beg,iterator end,value)

beg表示开始,end表示结束,value是要填充的值。

#include<iostream>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}
int main(void)
{
	vector<int> v;
	v.resize(10);
	fill(v.begin(), v.end(), 100);
	for_each(v.begin(), v.end(), print);
	return 0;
}

程序的输出是:

100   100   100   100   100   100   100   100   100   100

容器最初预留了10个空间,没有填充值,随后全部填充为100。

常用集合算法

使用常用集合算法需要包含头文件algorithm

set_intersection

set_intersection用于求两个容器的交集。函数原型是:

set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

要开辟足够的空间,两个容器交集的大小不大于两个容器的较小的大小。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}

int main(void)
{
	vector<int> v1;
	vector<int> v2;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	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, print);
	cout << endl;
	return 0;
}

程序的输出是:

6   7   8   9   10

set_union

set_union求两个容器的并集,函数原型是:

set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

要开辟足够的空间,两个容器并集的大小不大于两个容器的大小之和。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}
int main(void)
{
	vector<int> v1;
	vector<int> v2;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	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, print);
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10   11   12   13   14   15

set_difference

set_difference求两个集合的差集。函数原型是:

set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

要开辟足够的空间,两个容器差集的大小不大于两个容器中较大的大小。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(int num)
{
	cout << num << "   ";
}
int main(void)
{
	vector<int> v1;
	vector<int> v2;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	vector<int> v3;
	vector<int> v4;
	v3.resize(max(v1.size(), v2.size()));
	v4.resize(max(v1.size(), v2.size()));
	vector<int>::iterator end3 = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end3, print);
	cout << endl;

	vector<int>::iterator end4 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v4.begin());
	for_each(v4.begin(), end4, print);
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5
11   12   13   14   15
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值