C++笔记8.08

知识点1 STL的概述

STL(Standard Template Library)标准模板库

STL的三大组件:容器(container)、算法(algorithm)、迭代器(iterator)

算法用来操作数据、容器用来存储数据。算法不依赖于数据。在算法和容器之间引入迭代器的概念。每一个容器都会有相应的迭代器。算法就可以借助迭代器操作容器。

STL的六大组件:容器 算法 迭代器 仿函数 适配器 空间配置器

容器:容器,置物之所也。存放数据

算法:算法,问题之解法也。操作数据

迭代器:容器和算法的桥梁,是一种抽象的设计概念,现实程序语言中没有直接对应这个概念的实物。迭代器提供一种方法使之能够寻访某个容器所含的各个元素,而又无需暴露该容器内部表示方式。是STL的关键所在。

仿函数:为算法提供更多的策略

适配器:为算法提供更多的参数接口

空间配置器:管理容器和算法的所需配置空间

算法的分类:质变算法:运算过程中会更改区间内的元素的内容。例如拷贝,构造,删除等

      非质变算法:运算过程中不会改变区间内元素的内容。如查找,计数,遍历等

迭代器的种类

输入迭代 器提供对数据的只读的访问只读,支持++、==、!=
输出迭代器提供对数据的只写访问只写,支持++
前向迭代器提供读写操作,能向前推进迭代器读写,支持++、==、!=
双向迭代器提供读写操作,能向前向后操作读写,支持++、--
随机访问迭代器提供读写操作,并能以跳跃方式访问容器的任意数据,是功能最强大的迭代器读写,支持++、--、[n]、-n、<、<=、>、>=

知识点2迭代器的案例

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4.   
  5. using namespace std;  
  6.   
  7. void myPrint(int val)  
  8. {  
  9.     cout << val << " ";  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     vector <int> v;  
  15.     v.push_back(100);  
  16.     v.push_back(200);  
  17.     v.push_back(300);  
  18.     v.push_back(400);  
  19.   
  20.     vector<int>::iterator beginIt = v.begin();  
  21.     vector<int>::iterator endIt = v.end();  
  22.     //for循环遍历1  
  23.     for (;beginIt != endIt; beginIt++)  
  24.     {  
  25.         cout << *beginIt << " ";  
  26.     }  
  27.     cout << endl;  
  28.     //for循环遍历2  
  29.     for(vector<int>::iterator it = v.begin(); it != v.end(); it++)  
  30.     {  
  31.         cout << *it << " ";  
  32.     }  
  33.     cout << endl;  
  34.     //STL 提供的算法来遍历容器 #include <algorithm>  
  35.     //for_each 从容器的起始到结束逐个元素取出  
  36.     for_each(v.begin(), v.end(),myPrint);  
  37.     cout << endl;  
  38.     return 0;  
  39. }  

容器也可以存放自定义数据类型

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4. #include <cstring>  
  5.   
  6. using namespace std;  
  7.   
  8. class Person  
  9. {  
  10. public:  
  11.     string name;  
  12.     int age;  
  13.     Person(string name, int age)  
  14.     {  
  15.         this->name = name;  
  16.         this->age = age;  
  17.     }  
  18. };  
  19.   
  20. void myPrintPerson(Person &ob)  
  21. {  
  22.     cout << "name:" << ob.name << ", age:" << ob.age << endl;  
  23. }  
  24.   
  25. int main()  
  26. {  
  27.     Person ob1("阿尔贝尔",114514);  
  28.     Person ob2("小仓唯",110);  
  29.     Person ob3("里昂",23);  
  30.     Person ob4("耗子尾汁",69);  
  31.   
  32.     vector<Person> v;  
  33.     v.push_back(ob1);  
  34.     v.push_back(ob2);  
  35.     v.push_back(ob3);  
  36.     v.push_back(ob4);  
  37.   
  38.     for_each(v.begin(), v.end(), myPrintPerson);  
  39.     return 0;  
  40. }  

容器也可以嵌套容器

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4. #include <cstring>  
  5.   
  6. using namespace std;  
  7.   
  8. int main()  
  9. {  
  10.     vector<int> v1;  
  11.     vector<int> v2;  
  12.     vector<int> v3;  
  13.   
  14.     v1.push_back(10);  
  15.     v1.push_back(20);  
  16.     v1.push_back(30);  
  17.     v1.push_back(40);  
  18.   
  19.     v2.push_back(100);  
  20.     v2.push_back(200);  
  21.     v2.push_back(300);  
  22.     v2.push_back(400);  
  23.   
  24.     v3.push_back(1000);  
  25.     v3.push_back(2000);  
  26.     v3.push_back(3000);  
  27.     v3.push_back(4000);  
  28.   
  29.     //再定义一个vector容器存放v1 v2 v3  
  30.     vector<vector<int>> v;  
  31.   
  32.     v.push_back(v1);  
  33.     v.push_back(v2);  
  34.     v.push_back(v3);  
  35.   
  36.     //for循环遍历  
  37.     for(vector<vector<int>>::iterator it = v.begin(); it!= v.end(); it++)  
  38.     {  
  39.         for(vector<int>::iterator mit = (*it).begin(); mit!= (*it).end(); mit++)  
  40.         {  
  41.             cout << *mit << " ";  
  42.         }  
  43.         cout << endl;  
  44.     }  
  45.     cout << endl;  
  46.     return 0;  
  47. }  

知识点3 string类

string 的构造和赋值

  1. #include <iostream>  
  2. #include <cstring>  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     //使用字符串s初始化  
  9.     string str1("hello string");  
  10.     cout << str1 << endl;//hello string  
  11.     //使用n个字符串c初始化  
  12.     string str2(10,'H');  
  13.     cout << str2 << endl;//HHHHHHHHHH  
  14.   
  15.     string str3 = str2;  
  16.     cout << str3 << endl;//HHHHHHHHHH  
  17.   
  18.     string str4;  
  19.     str4 = str1;  
  20.     cout << str4 << endl;//hello string  
  21.   
  22.     string str5;  
  23.     str5 = "hello str5";  
  24.     cout << str5 << endl;//hello str5  
  25.   
  26.     string str6;  
  27.     str6 = 'H';  
  28.     cout << str6 << endl;//H  
  29.   
  30.     string str7;  
  31.     str7.assign("hello str7");  
  32.     cout << str7 << endl;//hello str7  
  33.   
  34.     string str8;  
  35.     str8.assign("hello str7",5);  
  36.     cout << str8 << endl;//hello   
  37.   
  38.     string str9;  
  39.     str9.assign(str8);  
  40.     cout << str9 << endl;////hello   
  41.   
  42.     string str10;  
  43.     str10.assign(10,'W');  
  44.     cout << str10 << endl;//WWWWWWWWWW  
  45.   
  46.     string str11;  
  47.     str11.assign("momoka",2,2);  
  48.     cout << str11 << endl;//mo  
  49.   
  50.     return 0;  
  51. }  

string的字符的存取

  1. #include <iostream>  
  2. #include <cstring>  
  3. #include <exception>  
  4.   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     string str1 = "hello string";  
  10.     cout << str1[1] << endl;  
  11.     cout << str1.at(1) << endl;  
  12.   
  13.     str1[1] = 'E';  
  14.     cout << str1 << endl;  
  15.   
  16.     str1.at(7) = 'T';  
  17.     cout << str1 << endl;  
  18.   
  19.     //[]和at()的区别  
  20.     try  
  21.     {  
  22.     //str1[1000] = 'G';//越界不抛出异常  
  23.     str1.at(1000) = 'G';//basic_string::at: __n (which is 1000) >= this->size() (which is 12)  
  24.     }  
  25.     catch (exception &e)  
  26.     {  
  27.         cout << e.what() << endl;  
  28.     }  
  29.     return 0;  
  30. }  

发表评论

邮箱地址不会被公开。 必填项已用*标注