<!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 &lt;vector&gt;</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>&lt;</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\">&lt;iostream&gt;</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\">&lt;vector&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&quot;student.h&quot;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&lt;algorithm&gt;</span></span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">template</span>&lt;<span class=\"hljs-keyword\">typename</span> T&gt;\n<span class=\"hljs-type\">void</span> <span class=\"hljs-title\">print_vec</span><span class=\"hljs-params\">(vector&lt;T&gt; vec)</span>\n</span>{\n    cout &lt;&lt; <span class=\"hljs-string\">&quot;-------print begin---------&quot;</span> &lt;&lt; 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 &lt;&lt; <span class=\"hljs-string\">&quot;iterator = &quot;</span> &lt;&lt; *itr &lt;&lt; endl;\n    }\n    cout &lt;&lt; <span class=\"hljs-string\">&quot;--------print end----------&quot;</span> &lt;&lt; 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> &lt;<span class=\"hljs-keyword\">typename</span> T&gt;\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 &gt; 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&lt;<span class=\"hljs-type\">int</span>&gt; 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 &lt;string&gt;\nusing namespace std;\n\nclass Student\n{\nprivate:\n    int _id;\n    string _name;\npublic:\n    Student(const string&amp; 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\">&quot;student.h&quot;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&lt;iostream&gt;</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&amp; 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 &lt;&lt; <span class=\"hljs-string\">&quot;Hello!I&#x27;m &quot;</span> &lt;&lt; _name &lt;&lt; <span class=\"hljs-string\">&quot;,my id card is &quot;</span> &lt;&lt; _id &lt;&lt; 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&lt;Student&gt; 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\">&lt;iostream&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&lt;vector&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&lt;algorithm&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&lt;string.h&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\">&quot;student.h&quot;</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&lt;Student&gt; 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-&gt;<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 &lt; len; idx++)\n    {\n        c = <span class=\"hljs-string\">&#x27;a&#x27;</span> + <span class=\"hljs-built_in\">rand</span>() % <span class=\"hljs-number\">26</span>; <span class=\"hljs-comment\">//  rand()%26是取余,余数为0~25加上&#x27;a&#x27;,就是字母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 &gt; len2)\n        {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n        }\n        <span class=\"hljs-keyword\">if</span> (len1 &lt; 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>() &lt; 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&lt;Student&gt; students;\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-type\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <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&amp; 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 &lt;&lt; <span class=\"hljs-string\">&quot;--------------------------&quot;</span> &lt;&lt; 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&#x27;m hqghumeay,my id card is 0\nHello!I&#x27;m nlfdxfirc,my id card is 1\nHello!I&#x27;m scxggbw,my id card is 2\nHello!I&#x27;m fnqdux,my id card is 3\nHello!I&#x27;m fnfozvsr,my id card is 4\nHello!I&#x27;m kjprepg,my id card is 5\nHello!I&#x27;m xrpnrvys,my id card is 6\nHello!I&#x27;m mwcysyycq,my id card is 7\nHello!I&#x27;m evikeff,my id card is 8\nHello!I&#x27;m znimkk,my id card is 9\n--------------------------\nHello!I&#x27;m hqghumeay,my id card is 0\nHello!I&#x27;m nlfdxfirc,my id card is 1\nHello!I&#x27;m mwcysyycq,my id card is 7\nHello!I&#x27;m fnfozvsr,my id card is 4\nHello!I&#x27;m xrpnrvys,my id card is 6\nHello!I&#x27;m scxggbw,my id card is 2\nHello!I&#x27;m kjprepg,my id card is 5\nHello!I&#x27;m evikeff,my id card is 8\nHello!I&#x27;m fnqdux,my id card is 3\nHello!I&#x27;m znimkk,my id card is 9\n</code></pre>\n","children":[],"payload":{"lines":[259,282]}}]}]}]}]},{})</script>
</body>
</html>