<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Markmap</title> <style> * { margin: 0; padding: 0; } #mindmap { display: block; width: 100vw; height: 100vh; } </style> <link rel="stylesheet" href="https://gcore.jsdelivr.net/npm/@highlightjs/cdn-assets@11.8.0/styles/default.min.css"><link rel="stylesheet" href="https://gcore.jsdelivr.net/npm/markmap-toolbar@0.15.6/dist/style.css"> </head> <body> <svg id="mindmap"></svg> <script src="https://gcore.jsdelivr.net/npm/d3@7.8.5/dist/d3.min.js"></script><script src="https://gcore.jsdelivr.net/npm/markmap-view@0.15.6/dist/browser/index.js"></script><script src="https://gcore.jsdelivr.net/npm/markmap-toolbar@0.15.6/dist/index.js"></script><script>(r => { setTimeout(r); })(() => { const { markmap, mm } = window; const { el } = markmap.Toolbar.create(mm); el.setAttribute('style', 'position:absolute;bottom:20px;right:20px'); document.body.append(el); })</script><script>((getMarkmap, getOptions, root2, jsonOptions) => { const markmap = getMarkmap(); window.mm = markmap.Markmap.create( "svg#mindmap", (getOptions || markmap.deriveOptions)(jsonOptions), root2 ); })(() => window.markmap,null,{"type":"heading","depth":0,"payload":{"lines":[1,2]},"content":"C++顺序容器","children":[{"type":"heading","depth":1,"payload":{"lines":[2,3]},"content":"容器简介","children":[{"type":"heading","depth":2,"payload":{"lines":[3,4]},"content":"容器的概念","children":[{"type":"paragraph","depth":3,"payload":{"lines":[4,7]},"content":"容器是指存储相同数据类型的类模板,它既可以存储预定义的数据类型,也可以存储用户自定义的数据类型。<br>\n C++标准模板库(STL)提供了10种容器类型用于存储数据。这10种容器用于存储数据的数据结构各不相同,比如链表数组。<br>\n 容器可以分为顺序容器和关联容器。","children":[]}]},{"type":"heading","depth":2,"payload":{"lines":[8,9]},"content":"顺序容器的概念","children":[{"type":"paragraph","depth":3,"payload":{"lines":[9,11]},"content":"顺序容器是用于存放单一数据类型的模板。<br>\n 顺序容器是通过数据在容器中的位置来对数据进行访问。","children":[]}]},{"type":"heading","depth":2,"payload":{"lines":[12,13]},"content":"顺序容器的种类与选择","children":[{"type":"paragraph","depth":3,"payload":{"lines":[13,16]},"content":"vector: 动态数组,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。<br>\nlist:双向链表,支持快速插入和删除元素,在中间进行插入和删除元素较快,随机访问较慢。适用于存储大量元素,且需要频繁进行插入和删除元素的情况。<br>\ndeque:双端队列,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。","children":[]}]}]},{"type":"heading","depth":1,"payload":{"lines":[17,18]},"content":"vector简介","children":[{"type":"heading","depth":2,"payload":{"lines":[18,19]},"content":"C++帮助文档","children":[{"type":"ordered_list","depth":3,"payload":{"lines":[19,20],"startIndex":1},"content":"","children":[{"type":"list_item","depth":4,"payload":{"lines":[19,20],"index":1},"content":"1. <a href=\"https://zh.cppreference.com/w/cpp/container\">C++标准库文档</a>","children":[]}]},{"type":"ordered_list","depth":3,"payload":{"lines":[22,24],"startIndex":2},"content":"","children":[{"type":"list_item","depth":4,"payload":{"lines":[22,23],"index":2},"content":"2. <a href=\"https://legacy.cplusplus.com/\">C++帮助文档</a>","children":[]}]}]},{"type":"heading","depth":2,"payload":{"lines":[24,25]},"content":"vector的概念","children":[{"type":"paragraph","depth":3,"payload":{"lines":[25,27]},"content":"vector是根据数组实现的顺序容器。<br>\n vector是一种动态数组,可以动态地增加和缩小数组的大小,也能存储不同的数据类型。","children":[]}]},{"type":"heading","depth":2,"payload":{"lines":[28,29]},"content":"vector的操作","children":[{"type":"heading","depth":3,"payload":{"lines":[29,30]},"content":"vector的使用","children":[{"type":"paragraph","depth":4,"payload":{"lines":[30,36]},"content":"使用vector需要包含头文件<code>#include <vector></code>。<br>\n vector的常用操作包括:<br>\n 1.<code>vector::push_back</code> 在数组尾部添加元素<br>\n 2.<code>vector::pop_back</code> 删除数组尾部元素<br>\n 3.<code>vector::operator[]</code> 通过下标访问数组中的元素<br>\n 4.<code>vector::sort</code> vector排序,vector的元素重载了运算符<code><</code>,或者自行指定比较函数","children":[]}]},{"type":"heading","depth":3,"payload":{"lines":[36,37]},"content":"示例代码","children":[{"type":"ordered_list","depth":4,"payload":{"lines":[38,39],"startIndex":1},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[38,39],"index":1},"content":"1. 测试vector,新建<code>main.cpp</code>,代码如下:","children":[]}]},{"type":"blockquote","depth":4,"payload":{"lines":[39,46]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[39,46]},"content":"vector<int> arr; 表示声明一个int类型的vector<br>\n <code>arr.push_back(51)</code> 表示从名为arr的vector的尾部添加元素51<br>\n <code>arr.pop_back()</code> 表示从名为arr的vector的尾部删除元素<br>\n <code>print_vec</code> 是自定义函数,用于迭代打印vector的内容<br>\n <code>sort</code> 是排序函数,第一个参数为待排序的开始,第二个参数是排序的结束,第三个参数为排序方式<br>\n <code>sort(arr.begin(), arr.begin()+4)</code> 表示使用默认的升序排序排序 arr[0]到arr[3]四个元素<br>\n <code>sort(arr.begin(), arr.end(), myCompareObj)</code>ss 表示自定义降序排序 arr","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><iostream></span></span>\n<span class=\"hljs-keyword\">using</span> <span class=\"hljs-keyword\">namespace</span> std;\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><vector></span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">"student.h"</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><algorithm></span></span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">template</span><<span class=\"hljs-keyword\">typename</span> T>\n<span class=\"hljs-type\">void</span> <span class=\"hljs-title\">print_vec</span><span class=\"hljs-params\">(vector<T> vec)</span>\n</span>{\n cout << <span class=\"hljs-string\">"-------print begin---------"</span> << endl;\n <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">auto</span> itr = vec.<span class=\"hljs-built_in\">begin</span>(); itr != vec.<span class=\"hljs-built_in\">end</span>(); ++itr)\n {\n cout << <span class=\"hljs-string\">"iterator = "</span> << *itr << endl;\n }\n cout << <span class=\"hljs-string\">"--------print end----------"</span> << endl;\n}\n\n<span class=\"hljs-keyword\">struct</span> <span class=\"hljs-title class_\">myCompare</span>\n{\n <span class=\"hljs-keyword\">template</span> <<span class=\"hljs-keyword\">typename</span> T>\n <span class=\"hljs-function\"><span class=\"hljs-type\">bool</span> <span class=\"hljs-title\">operator</span><span class=\"hljs-params\">()</span> <span class=\"hljs-params\">(T x, T y)</span> </span>{ <span class=\"hljs-keyword\">return</span> (x > y); }\n} myCompareObj;\n\n<span class=\"hljs-function\"><span class=\"hljs-type\">int</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(<span class=\"hljs-type\">int</span> argc, <span class=\"hljs-type\">char</span> *argv[])</span>\n</span>{ \n vector<<span class=\"hljs-type\">int</span>> arr;\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">51</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">32</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">79</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">45</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">67</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">85</span>);\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">34</span>);\n <span class=\"hljs-built_in\">print_vec</span>(arr);\n arr.<span class=\"hljs-built_in\">pop_back</span>();\n arr.<span class=\"hljs-built_in\">push_back</span>(<span class=\"hljs-number\">44</span>);\n <span class=\"hljs-built_in\">print_vec</span>(arr);\n <span class=\"hljs-built_in\">sort</span>(arr.<span class=\"hljs-built_in\">begin</span>(), arr.<span class=\"hljs-built_in\">begin</span>()+<span class=\"hljs-number\">4</span>);\n <span class=\"hljs-built_in\">print_vec</span>(arr);\n <span class=\"hljs-built_in\">sort</span>(arr.<span class=\"hljs-built_in\">begin</span>(), arr.<span class=\"hljs-built_in\">end</span>(), myCompareObj);\n <span class=\"hljs-built_in\">print_vec</span>(arr);\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n\n</code></pre>\n","children":[],"payload":{"lines":[47,93]}},{"type":"ordered_list","depth":4,"payload":{"lines":[93,94],"startIndex":4},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[93,94],"index":4},"content":"4. 编译运行,效果如下:","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-terminal\">-------print begin---------\niterator = 51\niterator = 32\niterator = 79\niterator = 45\niterator = 67\niterator = 85\niterator = 34\n--------print end----------\n-------print begin---------\niterator = 51\niterator = 32\niterator = 79\niterator = 45\niterator = 67\niterator = 85\niterator = 44\n--------print end----------\n-------print begin---------\niterator = 32\niterator = 45\niterator = 51\niterator = 79\niterator = 67\niterator = 85\niterator = 44\n--------print end----------\n-------print begin---------\niterator = 85\niterator = 79\niterator = 67\niterator = 51\niterator = 45\niterator = 44\niterator = 32\n--------print end----------\n</code></pre>\n","children":[],"payload":{"lines":[94,132]}},{"type":"blockquote","depth":4,"payload":{"lines":[132,133]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[132,133]},"content":"上述介绍了简单的C++ vector的用法,包括创建、插入、删除、排序等操作。接下来对<code>Student</code>类作为<code>vector</code>的元素进行操作,并实现自定义排序规则。","children":[]}]},{"type":"ordered_list","depth":4,"payload":{"lines":[134,135],"startIndex":2},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[134,135],"index":2},"content":"2. 声明学生信息类,新建<code>student.h</code>,代码如下:","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-h\">#pragma once\n#ifndef _STUDENT_H\n#define _STUDENT_H\n#include <string>\nusing namespace std;\n\nclass Student\n{\nprivate:\n int _id;\n string _name;\npublic:\n Student(const string& name, int id);\n int getId() const;\n string getName() const;\n void introduce() const;\n};\n#endif // !_STUDENT_H\n</code></pre>\n","children":[],"payload":{"lines":[135,155]}},{"type":"ordered_list","depth":4,"payload":{"lines":[156,157],"startIndex":3},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[156,157],"index":3},"content":"3. 实现学生信息类,新建<code>student.cpp</code>,代码如下:","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">"student.h"</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><iostream></span></span>\n<span class=\"hljs-keyword\">using</span> <span class=\"hljs-keyword\">namespace</span> std;\n\nStudent::<span class=\"hljs-built_in\">Student</span>(<span class=\"hljs-type\">const</span> string& name, <span class=\"hljs-type\">int</span> id)\n :_name(name), _id(id)\n{\n}\n<span class=\"hljs-function\"><span class=\"hljs-type\">int</span> <span class=\"hljs-title\">Student::getId</span><span class=\"hljs-params\">()</span> <span class=\"hljs-type\">const</span>\n</span>{\n <span class=\"hljs-keyword\">return</span> _id;\n}\n<span class=\"hljs-function\">string <span class=\"hljs-title\">Student::getName</span><span class=\"hljs-params\">()</span> <span class=\"hljs-type\">const</span>\n</span>{\n <span class=\"hljs-keyword\">return</span> _name;\n}\n<span class=\"hljs-function\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title\">Student::introduce</span><span class=\"hljs-params\">()</span> <span class=\"hljs-type\">const</span>\n</span>{\n cout << <span class=\"hljs-string\">"Hello!I'm "</span> << _name << <span class=\"hljs-string\">",my id card is "</span> << _id << endl;\n}\n</code></pre>\n","children":[],"payload":{"lines":[157,179]}},{"type":"ordered_list","depth":4,"payload":{"lines":[180,181],"startIndex":4},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[180,181],"index":4},"content":"4. 重新编写<code>main.cpp</code>文件,代码如下:","children":[]}]},{"type":"blockquote","depth":4,"payload":{"lines":[181,185]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[181,185]},"content":"<code>print_stu_vec(vector<Student> vec)</code> 是迭代打印学生信息的函数,vec是学生信息的vector。<br>\n <code>rand_str(const int len)</code> 是随机26英文小写字母字符串的函数,len是字符串的长度。<br>\n <code>struct testCompare</code> 是自定义比较结构体,用于sort排序,优先比较名字长度,再比较id大小,越小越前。<br>\n测试代码如下<code>test</code>函数","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-cpp\">\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><iostream></span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><vector></span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><algorithm></span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><string.h></span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">"student.h"</span></span>\n<span class=\"hljs-keyword\">using</span> <span class=\"hljs-keyword\">namespace</span> std;\n\n<span class=\"hljs-function\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title\">print_stu_vec</span><span class=\"hljs-params\">(vector<Student> vec)</span>\n</span>{\n <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">auto</span> itr = vec.<span class=\"hljs-built_in\">begin</span>(); itr != vec.<span class=\"hljs-built_in\">end</span>(); ++itr)\n {\n itr-><span class=\"hljs-built_in\">introduce</span>();\n }\n}\n<span class=\"hljs-function\">string <span class=\"hljs-title\">rand_str</span><span class=\"hljs-params\">(<span class=\"hljs-type\">const</span> <span class=\"hljs-type\">int</span> len)</span>\n</span>{\n string str; \n <span class=\"hljs-type\">char</span> c; \n <span class=\"hljs-type\">int</span> idx; \n <span class=\"hljs-keyword\">for</span> (idx = <span class=\"hljs-number\">0</span>; idx < len; idx++)\n {\n c = <span class=\"hljs-string\">'a'</span> + <span class=\"hljs-built_in\">rand</span>() % <span class=\"hljs-number\">26</span>; <span class=\"hljs-comment\">// rand()%26是取余,余数为0~25加上'a',就是字母a~z,详见asc码表</span>\n str.<span class=\"hljs-built_in\">push_back</span>(c);\n }\n <span class=\"hljs-keyword\">return</span> str; \n}\n<span class=\"hljs-keyword\">struct</span> <span class=\"hljs-title class_\">testCompare</span>\n{\n <span class=\"hljs-function\"><span class=\"hljs-type\">bool</span> <span class=\"hljs-title\">operator</span><span class=\"hljs-params\">()</span> <span class=\"hljs-params\">(Student stu1, Student stu2)</span> \n </span>{\n <span class=\"hljs-type\">const</span> <span class=\"hljs-type\">int</span> len1 = stu1.<span class=\"hljs-built_in\">getName</span>().<span class=\"hljs-built_in\">length</span>();\n <span class=\"hljs-type\">const</span> <span class=\"hljs-type\">int</span> len2 = stu2.<span class=\"hljs-built_in\">getName</span>().<span class=\"hljs-built_in\">length</span>();\n <span class=\"hljs-keyword\">if</span> (len1 > len2)\n {\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n }\n <span class=\"hljs-keyword\">if</span> (len1 < len2)\n {\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n }\n <span class=\"hljs-keyword\">else</span>\n {\n <span class=\"hljs-built_in\">return</span> (stu1.<span class=\"hljs-built_in\">getId</span>() < stu2.<span class=\"hljs-built_in\">getId</span>());\n }\n }\n}testCompareObj;\n<span class=\"hljs-function\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title\">test00</span><span class=\"hljs-params\">()</span>\n</span>{\n vector<Student> students;\n <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-type\">int</span> i = <span class=\"hljs-number\">0</span>; i < <span class=\"hljs-number\">10</span>; ++i)\n {\n <span class=\"hljs-type\">const</span> <span class=\"hljs-type\">int</span> len = <span class=\"hljs-built_in\">rand</span>() % <span class=\"hljs-number\">6</span>+<span class=\"hljs-number\">4</span>;\n <span class=\"hljs-type\">const</span> string& name = <span class=\"hljs-built_in\">rand_str</span>(len);\n <span class=\"hljs-function\">Student <span class=\"hljs-title\">stu</span><span class=\"hljs-params\">(name, i)</span></span>;\n students.<span class=\"hljs-built_in\">push_back</span>(stu);\n }\n <span class=\"hljs-built_in\">print_stu_vec</span>(students);\n cout << <span class=\"hljs-string\">"--------------------------"</span> << endl;\n <span class=\"hljs-built_in\">sort</span>(students.<span class=\"hljs-built_in\">begin</span>(), students.<span class=\"hljs-built_in\">end</span>(), testCompareObj);\n <span class=\"hljs-built_in\">print_stu_vec</span>(students);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-type\">int</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(<span class=\"hljs-type\">int</span> argc, <span class=\"hljs-type\">char</span> *argv[])</span>\n</span>{ \n\n <span class=\"hljs-built_in\">test00</span>();\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n\n</code></pre>\n","children":[],"payload":{"lines":[185,257]}},{"type":"ordered_list","depth":4,"payload":{"lines":[258,259],"startIndex":5},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[258,259],"index":5},"content":"5. 运行程序,输出结果如下:","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-terminal\">Hello!I'm hqghumeay,my id card is 0\nHello!I'm nlfdxfirc,my id card is 1\nHello!I'm scxggbw,my id card is 2\nHello!I'm fnqdux,my id card is 3\nHello!I'm fnfozvsr,my id card is 4\nHello!I'm kjprepg,my id card is 5\nHello!I'm xrpnrvys,my id card is 6\nHello!I'm mwcysyycq,my id card is 7\nHello!I'm evikeff,my id card is 8\nHello!I'm znimkk,my id card is 9\n--------------------------\nHello!I'm hqghumeay,my id card is 0\nHello!I'm nlfdxfirc,my id card is 1\nHello!I'm mwcysyycq,my id card is 7\nHello!I'm fnfozvsr,my id card is 4\nHello!I'm xrpnrvys,my id card is 6\nHello!I'm scxggbw,my id card is 2\nHello!I'm kjprepg,my id card is 5\nHello!I'm evikeff,my id card is 8\nHello!I'm fnqdux,my id card is 3\nHello!I'm znimkk,my id card is 9\n</code></pre>\n","children":[],"payload":{"lines":[259,282]}}]}]}]}]},{})</script> </body> </html>