在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十一篇博客。
本篇博客介绍了C++的常用排序算法,常用拷贝和替换算法,常用算数生成算法,常用集合算法。
本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。
目录
常用排序算法
使用排序算法需要包含头文件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