<!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":[2,3]},"content":"迭代器","children":[{"type":"heading","depth":1,"payload":{"lines":[4,5]},"content":"迭代器的概念","children":[{"type":"paragraph","depth":2,"payload":{"lines":[5,8]},"content":"迭代器是一个用来遍历容器内元素的对象,它本身不拥有数据,而是通过指向容器内元素的方式,来访问容器内的元素。<br>\n 迭代器提供了类似指针的运算符: <code>* 、++ 、== 、!= 、 =</code>。这些操作和<code>C/C++</code>指针的接口一致。<br>\n 迭代器可以指向容器中的任意元素,它有指向容器中元素的指针。","children":[]}]},{"type":"heading","depth":1,"payload":{"lines":[8,9]},"content":"迭代器的操作","children":[{"type":"blockquote","depth":2,"payload":{"lines":[9,10]},"content":"","children":[{"type":"paragraph","depth":3,"payload":{"lines":[9,10]},"content":"获取不同容器的迭代器类型","children":[]}]},{"type":"blockquote","depth":2,"payload":{"lines":[12,13]},"content":"","children":[{"type":"paragraph","depth":3,"payload":{"lines":[12,13]},"content":"获取容器中指向首个元素的迭代器","children":[]}]},{"type":"blockquote","depth":2,"payload":{"lines":[16,17]},"content":"","children":[{"type":"paragraph","depth":3,"payload":{"lines":[16,17]},"content":"获取容器中指向末尾元素的迭代器","children":[]}]},{"type":"heading","depth":2,"payload":{"lines":[20,21]},"content":"示例代码","children":[{"type":"heading","depth":3,"payload":{"lines":[21,22]},"content":"基本类型的迭代器","children":[{"type":"ordered_list","depth":4,"payload":{"lines":[22,23],"startIndex":1},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[22,23],"index":1},"content":"1. 编写<code>main.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\"><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-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\">test01</span><span class=\"hljs-params\">()</span>\n</span>{\n vector<<span class=\"hljs-type\">int</span>> arr;\n vector<<span class=\"hljs-type\">int</span>>::iterator it;\n <span class=\"hljs-type\">int</span> i = <span class=\"hljs-number\">0</span>;\n <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i < <span class=\"hljs-number\">10</span>; ++i)\n {\n arr.<span class=\"hljs-built_in\">push_back</span>(i);\n }\n <span class=\"hljs-keyword\">for</span> (it = arr.<span class=\"hljs-built_in\">begin</span>(); it != arr.<span class=\"hljs-built_in\">end</span>(); ++it)\n {\n cout << *it << endl;\n }\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 <span class=\"hljs-built_in\">test01</span>();\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre>\n","children":[],"payload":{"lines":[23,49]}},{"type":"ordered_list","depth":4,"payload":{"lines":[49,50],"startIndex":2},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[49,50],"index":2},"content":"2. 编译运行,结果如下","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-terminal\">0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n</code></pre>\n","children":[],"payload":{"lines":[50,62]}}]},{"type":"heading","depth":3,"payload":{"lines":[62,63]},"content":"类类型的迭代器","children":[{"type":"ordered_list","depth":4,"payload":{"lines":[63,64],"startIndex":1},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[63,64],"index":1},"content":"1. 声明学生类,编写<code>student.h</code>,代码如下","children":[]}]},{"type":"blockquote","depth":4,"payload":{"lines":[64,65]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[64,65]},"content":"学生类的声明,包含私有成员变量<code>_id</code>和<code>_name</code>,公共方法<code>getId()</code>,<code>getName()</code>,<code>introduce()</code>以及构造函数<code>Student(const string& name, int id)</code>。","children":[]}]},{"type":"fence","depth":4,"content":"<pre><code class=\"language-h\">#pragma once\n#ifndef _STUDENT_H\n#define _STUDENT_H\n\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":[65,86]}},{"type":"ordered_list","depth":4,"payload":{"lines":[86,87],"startIndex":2},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[86,87],"index":2},"content":"2. 实现学生类,编写<code>student.cpp</code>,代码如下","children":[]}]},{"type":"blockquote","depth":4,"payload":{"lines":[87,88]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[87,88]},"content":"实现公共方法","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":[88,110]}},{"type":"ordered_list","depth":4,"payload":{"lines":[110,111],"startIndex":3},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[110,111],"index":3},"content":"3. 修改<code>main.cpp</code>,代码如下","children":[]}]},{"type":"blockquote","depth":4,"payload":{"lines":[111,115]},"content":"","children":[{"type":"paragraph","depth":5,"payload":{"lines":[111,112]},"content":"其中写了很多方法,列出方法使用说明","children":[]},{"type":"ordered_list","depth":5,"payload":{"lines":[112,115],"startIndex":1},"content":"","children":[{"type":"list_item","depth":6,"payload":{"lines":[112,113],"index":1},"content":"1. <code>string rand_str(const int len)</code> 随机获取<code>len</code>长度的字符串,字符串内容为<code>a-z</code>的随机组合。","children":[]},{"type":"list_item","depth":6,"payload":{"lines":[113,114],"index":2},"content":"2. <code>struct testCompare</code> 结构体,包含<code>operator()</code>方法,用于比较<code>Student</code>类对象,配合sort方法使用。","children":[]},{"type":"list_item","depth":6,"payload":{"lines":[114,115],"index":3},"content":"3. <code>void test02()</code> 测试<code>Student</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\"><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\">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\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\n<span class=\"hljs-function\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title\">test02</span><span class=\"hljs-params\">()</span>\n</span>{\n vector<Student> arr;\n vector<Student>::iterator it;\n <span class=\"hljs-type\">int</span> i = <span class=\"hljs-number\">0</span>;\n <span class=\"hljs-keyword\">for</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 arr.<span class=\"hljs-built_in\">push_back</span>(stu);\n }\n <span class=\"hljs-keyword\">for</span> (it = arr.<span class=\"hljs-built_in\">begin</span>(); it != arr.<span class=\"hljs-built_in\">end</span>(); ++it)\n {\n it-><span class=\"hljs-built_in\">introduce</span>();\n }\n <span class=\"hljs-built_in\">sort</span>(arr.<span class=\"hljs-built_in\">begin</span>(), arr.<span class=\"hljs-built_in\">end</span>(), testCompareObj);\n cout << <span class=\"hljs-string\">"重新排序后"</span> << endl;\n <span class=\"hljs-keyword\">for</span> (it = arr.<span class=\"hljs-built_in\">begin</span>(); it != arr.<span class=\"hljs-built_in\">end</span>(); ++it)\n {\n it-><span class=\"hljs-built_in\">introduce</span>();\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 <span class=\"hljs-built_in\">test02</span>();\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre>\n","children":[],"payload":{"lines":[115,186]}},{"type":"ordered_list","depth":4,"payload":{"lines":[186,187],"startIndex":3},"content":"","children":[{"type":"list_item","depth":5,"payload":{"lines":[186,187],"index":3},"content":"3. 编译运行代码","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":[187,210]}}]}]}]},{"type":"heading","depth":1,"payload":{"lines":[211,212]},"content":"迭代器失效现象","children":[{"type":"blockquote","depth":2,"payload":{"lines":[212,214]},"content":"","children":[{"type":"paragraph","depth":3,"payload":{"lines":[212,214]},"content":"因为容器存储数据在内存中的结构会随着数据的增删发生变化,所以当对容器进行增删操作时,迭代器可能会出现失效的情况。<br>\n 例如某容器有5个元素,迭代器指向第5个元素时,删除容器某一个元素,此时第五个元素就不存在了,迭代器就失效了。","children":[]}]},{"type":"heading","depth":2,"payload":{"lines":[214,215]},"content":"示例代码","children":[{"type":"ordered_list","depth":3,"payload":{"lines":[215,216],"startIndex":1},"content":"","children":[{"type":"list_item","depth":4,"payload":{"lines":[215,216],"index":1},"content":"1. 编写<code>main.cpp</code>,代码如下","children":[]}]},{"type":"fence","depth":3,"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-meta\">#<span class=\"hljs-keyword\">include</span> <span class=\"hljs-string\"><vector></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\">test03</span><span class=\"hljs-params\">()</span>\n</span>{ \n vector<<span class=\"hljs-type\">int</span>> arr;\n vector<<span class=\"hljs-type\">int</span>>::iterator it;\n <span class=\"hljs-type\">int</span> i = <span class=\"hljs-number\">0</span>;\n <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i < <span class=\"hljs-number\">5</span>; ++i)\n {\n arr.<span class=\"hljs-built_in\">push_back</span>(i);\n }\n it = arr.<span class=\"hljs-built_in\">end</span>() - <span class=\"hljs-number\">1</span>;\n\n cout << <span class=\"hljs-string\">"it:"</span> << *it << endl;\n arr.<span class=\"hljs-built_in\">pop_back</span>();\n cout << <span class=\"hljs-string\">"it:"</span> << *it << endl;\n\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 <span class=\"hljs-built_in\">test03</span>();\n <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre>\n","children":[],"payload":{"lines":[216,244]}},{"type":"ordered_list","depth":3,"payload":{"lines":[244,245],"startIndex":2},"content":"","children":[{"type":"list_item","depth":4,"payload":{"lines":[244,245],"index":2},"content":"2. 编译运行,结果如下","children":[]}]},{"type":"fence","depth":3,"content":"<pre><code class=\"language-terminal\">it:4\n\n</code></pre>\n","children":[],"payload":{"lines":[245,249]}}]}]}]},{})</script> </body> </html>