<!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\">&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-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&lt;<span class=\"hljs-type\">int</span>&gt; arr;\n    vector&lt;<span class=\"hljs-type\">int</span>&gt;::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 &lt; <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 &lt;&lt; *it &lt;&lt; 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&amp; 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 &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":[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\">&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":[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\">&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\">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\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\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&lt;Student&gt; arr;\n    vector&lt;Student&gt;::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 &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 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-&gt;<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 &lt;&lt; <span class=\"hljs-string\">&quot;重新排序后&quot;</span> &lt;&lt; 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-&gt;<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&#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":[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\">&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-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&lt;<span class=\"hljs-type\">int</span>&gt; arr;\n    vector&lt;<span class=\"hljs-type\">int</span>&gt;::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 &lt; <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 &lt;&lt; <span class=\"hljs-string\">&quot;it:&quot;</span> &lt;&lt; *it &lt;&lt; endl;\n    arr.<span class=\"hljs-built_in\">pop_back</span>();\n    cout &lt;&lt; <span class=\"hljs-string\">&quot;it:&quot;</span> &lt;&lt; *it &lt;&lt; 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>