在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十篇博客。
本篇博客介绍了C++的常用遍历算法和常用查找算法。
本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。
目录
算法主要由头文件algorithm functional numeric组成。
algorithm是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历操作、复制、修改等。
numeric内容比较少,只包括几个在序列上面进行简单数学运算的模板函数。
functional定义一些模板类,用于声明函数对象。
使用遍历算法需要包含algortihm。
for_each实现遍历容器。函数原型是:
for_each(iterator beg,iterator end,func)
用于遍历容器元素,beg表示开始,end表示结束,func是函数或函数对象。
- #include
- #include
- #include
- using namespace std;
- void print(int num) {
- cout << num << " ";
- }
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
-
- for_each(v.begin(), v.end(), print);
- return 0;
- }
程序的输出是:
1 2 3 4 5 6 7 8 9 10
- #include
- #include
- #include
- using namespace std;
- class print
- {
- public:
- void operator() (int num) {
- cout << num << " ";
- }
- };
-
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
-
- for_each(v.begin(), v.end(), print());
- return 0;
- }
程序的输出是:
1 2 3 4 5 6 7 8 9 10
transform用于搬运容器到另一个容器中。函数原型是:
transform(iterator beg1,iterator end1,iterator beg2,func)
beg1是源容器开始迭代器,end1是源容器结束迭代器。beg2是目标容器开始迭代器。func是函数或函数对象。将beg1到end1的元素通过func的规则拷贝到beg2开始的区间。func可以对元素的值进行修改。
用transform进行搬运时,必须提前分配空间。
- #include
- #include
- #include
- using namespace std;
- class print
- {
- public:
- void operator() (int num) {
- cout << num << " ";
- }
- };
-
- class tran
- {
- public:
- int operator()(int num) {
- return num + 10;
- }
- };
-
- int main(void)
- {
- vector<int> v1;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v1.push_back(i);
- }
- for_each(v1.begin(), v1.end(), print());
- cout << endl;
-
- vector<int> v2;
- v2.resize(v1.size());
- transform(v1.begin(), v1.end(), v2.begin(), tran());
- for_each(v2.begin(), v2.end(), print());
- cout << endl;
- return 0;
- }
print类重载()实现元素的输出。tran类重载()将元素的值加10后返回。main函数创建了一个容器v1,加入1至10,然后创建了v2,并提前分配足够空间,然后将v1的所有元素按tran的规则(加10)拷贝给v2。
程序的输出是:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
使用查找算法需要包含algortihm。
find查找指定元素,找到返回指定元素的迭代器,找不到就返回end。函数原型是:
find(iterator beg,iterator end,value)
beg是开始位置,end是结束位置,value是要查找的元素。
如果是自定义类型,要重载==。
- #include
- #include
- #include
- using namespace std;
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
-
- vector<int>::iterator it;
- it = find(v.begin(), v.end(), 5);
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found " << *it << endl;
- }
- it = find(v.begin(), v.end(), 15);
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found " << *it << endl;
- }
- return 0;
- }
程序的输出是:
Have found 5
Not found
- #include
- #include
- #include
- #include
- using namespace std;
- class person
- {
- public:
- string name;
- int age;
- person(string name, int age) {
- this->name = name;
- this->age = age;
- }
-
- bool operator==(person p) {
- if (this->name == p.name && this->age == p.age) {
- return true;
- }
- else {
- return false;
- }
- }
- };
- int main(void)
- {
- vector
v; - person p1("Jimena", 19);
- person p2("Javier", 18);
- person p3("Julia", 22);
- person p4("Jova", 23);
- person p5("Jose", 21);
- v.push_back(p1);
- v.push_back(p2);
- v.push_back(p3);
- v.push_back(p4);
- v.push_back(p5);
-
- vector
::iterator it; - person pp("Javier", 18);
- it = find(v.begin(), v.end(), pp);
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found" << endl;
- }
-
- person ppp("Julian", 19);
- it = find(v.begin(), v.end(), ppp);
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found" << endl;
- }
- return 0;
- }
person类有两个成员变量name和age,重载了==,只有两个类对象的name和age都相等才算相等。
程序的输出是:
Have found
Not found
find_if按条件查找元素。找到就返回相关位置的迭代器,否则就返回end。函数原型是:
find_if(iterator beg,iterator end,pred)
beg表示开始,end表示结束,pred是一个函数或者谓词。
- #include
- #include
- #include
- using namespace std;
- class compare
- {
- public:
- bool operator() (int num) {
- return num > 5;
- }
- };
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
-
- vector<int>::iterator it;
- it = find_if(v.begin(), v.end(), compare());
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found:" << *it << endl;
- }
- return 0;
- }
程序的输出是:
Have found:6
- #include
- #include
- #include
- #include
- using namespace std;
- class person
- {
- public:
- string name;
- int age;
- person(string name, int age) {
- this->name = name;
- this->age = age;
- }
- };
-
- class compare
- {
- public:
- bool operator()(person p) {
- return p.age > 20;
- }
- };
- int main(void)
- {
- vector
v; - person p1("John", 16);
- person p2("Juliette", 21);
- person p3("Kiko", 15);
- person p4("Kevin", 21);
- v.push_back(p1);
- v.push_back(p2);
- v.push_back(p3);
- v.push_back(p4);
-
- vector
::iterator it; - it = find_if(v.begin(), v.end(), compare());
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found." << "The name is " << it->name << " and the age is " << it->age << endl;
- }
- return 0;
- }
程序创建了person类,有成员变量name和age。compare类重载了(),返回类对象的age是否大于20。因此以这个函数对象作为参数的find_if函数将返回成员变量age大于20的第一个元素。
程序的输出是:
Have found.The name is Juliette and the age is 21
abjacent_find用于查找相邻重复元素。函数原型是
abjacent_find(iterator beg,iterator end)
查找相邻重复元素,返回相邻元素的第一个位置的迭代器。beg表示开始,end表示结束。
- #include
- #include
- #include
- using namespace std;
- int main(void)
- {
- vector<int> v;
- v.push_back(5);
- v.push_back(8);
- v.push_back(9);
- v.push_back(10);
- v.push_back(10);
- v.push_back(6);
-
- vector<int>::iterator it;
- it = adjacent_find(v.begin(), v.end());
- if (it == v.end()) {
- cout << "Not found" << endl;
- }
- else {
- cout << "Have found:" << *it << endl;
- }
- return 0;
- }
程序的输出是:
Have found:10
binary_search查找指定元素是否存在,找到返回true,找不到返回false。函数原型是:
bool binary_search(iterator beg,iterator end,value)
beg表示开始,end表示结束。value是要查找的元素。此函数必须在有序序列中用,否则会造成结果出错。这是由于此函数使用二分查找。
- #include
- #include
- #include
- using namespace std;
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
- bool flag = binary_search(v.begin(), v.end(), 6);
- if (flag == true) {
- cout << "Have found" << endl;
- }
- else {
- cout << "Not found" << endl;
- }
- return 0;
- }
容器按照1至10依次放入容器,是有序的。
程序的输出是:
Have found
count用于统计元素个数。函数原型是:
count(iterator beg,iterator end,value)
beg表示开始,end表示结束,value是统计的元素。
统计自定义类型需要重载==
- #include
- #include
- #include
- using namespace std;
- int main(void)
- {
- vector<int> v;
- v.push_back(10);
- v.push_back(20);
- v.push_back(40);
- v.push_back(50);
- v.push_back(20);
- v.push_back(30);
-
- cout << count(v.begin(), v.end(), 20) << endl;
- cout << count(v.begin(), v.end(), 60) << endl;
- return 0;
- }
程序的输出是:
2
0
- #include
- #include
- #include
- #include
- using namespace std;
- class person
- {
- public:
- string name;
- int age;
- person(string name, int age) {
- this->name = name;
- this->age = age;
- }
- bool operator==(person p) {
- if (this->age == p.age) {
- return true;
- }
- else {
- return false;
- }
- }
- };
-
- int main(void)
- {
- vector
v; - person p1("Estelle", 20);
- person p2("Eugene", 19);
- person p3("Emily", 17);
- person p4("Emilia", 18);
- person p5("Erick", 23);
- person p6("Erin", 21);
- person p7("Elida", 20);
- v.push_back(p1);
- v.push_back(p2);
- v.push_back(p3);
- v.push_back(p4);
- v.push_back(p5);
- v.push_back(p6);
- v.push_back(p7);
-
- person pa("Laura", 20);
- person pb("Irma", 25);
- cout << count(v.begin(), v.end(), pa) << endl;
- cout << count(v.begin(), v.end(), pb) << endl;
- return 0;
- }
程序创建了person类,有成员变量name和age,并重载了==,规定成员变量age相等就判为相等。
程序的输出是:
2
0
count_if按条件统计元素个数。函数原型是:
count_if(iterator beg,iterator end,pred)
beg表示开始迭代器,end表示结束迭代器,pred是一个谓词。
- #include
- #include
- #include
- using namespace std;
- class compare
- {
- public:
- bool operator() (int num) {
- return num > 4;
- }
- };
- int main(void)
- {
- vector<int> v;
- int i;
- for (i = 1; i <= 10; i += 1) {
- v.push_back(i);
- }
- cout << count_if(v.begin(), v.end(), compare());
- return 0;
- }
此程序的条件是值大于4。程序的输出是:
6
- #include
- #include
- #include
- #include
- using namespace std;
- class person
- {
- public:
- string name;
- int age;
- person(string name, int age) {
- this->name = name;
- this->age = age;
- }
- };
-
- class compare
- {
- public:
- bool operator() (person p) {
- return p.age > 15;
- }
- };
-
- int main(void)
- {
- vector
v; - person p1("Danny", 17);
- person p2("Darby", 20);
- person p3("Danielle", 12);
- person p4("Dora", 19);
- person p5("Daniel", 16);
- person p6("Dorian", 13);
- person p7("Douglas", 14);
-
- v.push_back(p1);
- v.push_back(p2);
- v.push_back(p3);
- v.push_back(p4);
- v.push_back(p5);
- v.push_back(p6);
- v.push_back(p7);
-
- cout << count_if(v.begin(), v.end(), compare());
- return 0;
- }
程序创建了person类,有成员变量name和age。条件是age成员变量大于15。
程序的输出是:
4