Files
张宗平 13b3ebbe14 课程代码仓库初始化:Part1 (144) + Part3 (29) 全量生成与验证
把川大 wiki「02.Qt方向」课程代码整理为 CMake 管理的可编译运行项目。

Part1 C/C++ 强化 (p01/, 144 目标, host gcc/g++ 构建, 全绿):
- 修复全部编译失败:补 <cstring>/<fstream>/<iomanip>/<vector> 等缺失头
  (common_fix + infer_stl_includes 自动检测注入)、修正 pause() 壳注入
  (改检测已转换后的 pause 调用)、namespace 提升出函数体、const 成员函数
  正确性、dedupe 不再破坏函数重载集、K&R 隐式 int / 动态异常规范等
  C++17 移除特性的可编译等价改写。
- 目录采用深缩写 p01/ch04/s03/ (原 part1_cpp/ch04_class_object/03_ctor_dtor)。

Part3 Qt 桌面 (p03/, 29 目标, 隔离 Qt 5.14.2 构建, 全绿):
- gen_part3.py: Qt 外壳模板 (main+QApplication+show, QTimer 自动退出便于
  offscreen 验证)、AUTOMOC + .moc include、rewrite_* 处理散文混入/重载/
  资源依赖、生成占位 png/gif + .qrc + rundata 样例数据。
- 修正 QLable 笔误、全角分号、.→->、Windows 路径、QApplication 阻塞事件
  循环改为 QCoreApplication 等。

任务1 概念/版本验证:
- tools/std_probe.py: 跨 -std= 编译探针 (--pedantic-errors 让已废除特性硬失败)。
- tools/demo_versions/: K&R 隐式 int、三目左值、void* 转换、enum 赋整、
  const 经指针、动态异常规范 共 6 个跨版本演示。
- docs/VERSION_NOTES.md: 每条「原文说法→C17/C++17 是否成立→何版本成立→已验证」。

文档: 顶层 README、docs/SOURCE_PAGES.md (页面→目录映射)、
docs/ERRATA.md (Part1 修正)、docs/ERRATA_part3.md (Part3 修正)。
另修复 tools/run.sh / run_qt.sh 的 ${1:?...} 引号语法 bug。

隔离 Qt 验证: ldd 0 系统 Qt 引用; 173/173 目标全绿; p03 offscreen 运行通过。
2026-06-30 14:16:55 +08:00

1 line
26 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"id":"58954498","type":"page","status":"current","title":"04.常用算法","version":{"by":{"type":"known","username":"ethanliu","userKey":"2c90931b6cfb654f016d5c69becc0001","profilePicture":{"path":"/images/icons/profilepics/default.svg","width":48,"height":48,"isDefault":true},"displayName":"刘浩","_links":{"self":"https://wiki.suncaper.net/rest/api/user?key=2c90931b6cfb654f016d5c69becc0001"},"_expandable":{"status":""}},"when":"2022-07-09T01:51:25.000Z","message":"","number":1,"minorEdit":false,"hidden":false,"_links":{"self":"https://wiki.suncaper.net/rest/experimental/content/58954498/version/1"},"_expandable":{"content":"/rest/api/content/58954498"}},"body":{"storage":{"value":"<ac:layout><ac:layout-section ac:type=\"two_right_sidebar\"><ac:layout-cell><h2>4.1 函数对象</h2><p>重载函数调用操作符的类,其对象常称为函数对象(<span>function object</span>),即它们是行为类似函数的对象,也叫仿函数<span>(functor),</span>其实就是重载“<span>()</span>”操作符,使得类对象可以像函数那样调用。</p><p>注意<span>:</span></p><p>1.函数对象<span>(</span>仿函数<span>)</span>是一个类,不是一个函数。</p><p>2.函数对象<span>(</span>仿函数<span>)</span>重载了<span>”() ”</span>操作符使得它可以像函数一样调用。</p><p>分类<span>:</span>假定某个类有一个重载的<span>operator()</span>,而且重载的<span>operator()</span>要求获取一个参数,我们就将这个类称为“一元仿函数<span>”</span><span>unary functor</span>);相反,如果重载的<span>operator()</span>要求获取两个参数,就将这个类称为“二元仿函数<span>”</span><span>binary functor</span>)。</p><p>函数对象的作用主要是什么?<span>STL</span>提供的算法往往都有两个版本,其中一个版本表现出最常用的某种运算,另一版本则允许用户通过<span>template</span>参数的形式来指定所要采取的策略。</p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"25b360ec-6093-4e03-8c36-29808303dfd4\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[//函数对象是重载了函数调用符号的类\nclass MyPrint\n{\npublic:\n\tMyPrint()\n\t{\n\t\tm_Num = 0;\n\t}\n\tint m_Num;\n\npublic:\n\tvoid operator() (int num)\n\t{\n\t\tcout << num << endl;\n\t\tm_Num++;\n\t}\n};\n\n//函数对象\n//重载了()操作符的类实例化的对象,可以像普通函数那样调用,可以有参数 ,可以有返回值\nvoid test01()\n{\n\tMyPrint myPrint;\n\tmyPrint(20);\n\n}\n// 函数对象超出了普通函数的概念,可以保存函数的调用状态\nvoid test02()\n{\n\tMyPrint myPrint;\n\tmyPrint(20);\n\tmyPrint(20);\n\tmyPrint(20);\n\tcout << myPrint.m_Num << endl;\n}\n\nvoid doBusiness(MyPrint print,int num)\n{\n\tprint(num);\n}\n\n//函数对象作为参数\nvoid test03()\n{\n\t//参数1:匿名函数对象\n\tdoBusiness(MyPrint(),30);\n}]]></ac:plain-text-body></ac:structured-macro><p>总结:</p><p>1、函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题。</p><p>2、函数对象超出普通函数的概念,函数对象可以有自己的状态</p><p>3、函数对象可内联编译,性能好。用函数指针几乎不可能</p><p>4、模版函数对象使函数对象具有通用性,这也是它的优势之一<span>  </span></p><p><br /></p><h2><span>4.2 </span>谓词</h2><p>谓词是指普通函数或重载的<span>operator()</span>返回值是<span>bool</span>类型的函数对象<span>(</span>仿函数<span>)</span>。如果<span>operator</span>接受一个参数,那么叫做一元谓词<span>,</span>如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式</p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"297eadb7-6bb1-49bf-9ed8-e9009ba120d2\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[class GreaterThenFive\n{\npublic:\n\tbool operator()(int num)\n\t{\n\t\treturn num > 5;\n\t}\n\n};\n//一元谓词\nvoid test01()\n{\n\tvector<int> v;\n\tfor (int i = 0; i < 10;i ++)\n\t{\n\t\tv.push_back(i);\n\t}\n\t\n\t vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterThenFive());\n\t if (it == v.end())\n\t {\n\t\t cout << \"没有找到\" << endl;\n\t }\n\t else\n\t {\n\t\t cout << \"找到了: \" << *it << endl;\n\t }\n}\n\n//二元谓词\nclass MyCompare\n{\npublic:\n\tbool operator()(int num1, int num2)\n\t{\n\t\treturn num1 > num2;\n\t}\n};\n\nvoid test02()\n{\n\tvector<int> v;\n\tv.push_back(10);\n\tv.push_back(40);\n\tv.push_back(20);\n\tv.push_back(90);\n\tv.push_back(60);\n\n\t//默认从小到大\n\tsort(v.begin(), v.end());\n\tfor (vector<int>::iterator it = v.begin(); it != v.end();it++)\n\t{\n\t\tcout << *it << \" \";\n\t}\n\tcout << endl;\n\tcout << \"----------------------------\" << endl;\n\t//使用函数对象改变算法策略,排序从大到小\n\tsort(v.begin(), v.end(),MyCompare());\n\tfor (vector<int>::iterator it = v.begin(); it != v.end(); it++)\n\t{\n\t\tcout << *it << \" \";\n\t}\n\tcout << endl;\n}]]></ac:plain-text-body></ac:structured-macro><h2><span>4.3 </span>内建函数对象</h2><p>STL内建了一些函数对象。分为<span>:</span>算数类函数对象<span>,</span>关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include&lt;functional&gt;。</p><p><span> </span></p><ul><li>6个算数类函数对象<span>,</span>除了<span>negate</span>是一元运算,其他都是二元运算。</li></ul><table><tbody><tr><td><p>template&lt;class T&gt; T plus&lt;T&gt;//加法仿函数</p><p>template&lt;class T&gt; T minus&lt;T&gt;//减法仿函数</p><p>template&lt;class T&gt; T multiplies&lt;T&gt;//乘法仿函数</p><p>template&lt;class T&gt; T divides&lt;T&gt;//除法仿函数</p><p>template&lt;class T&gt; T modulus&lt;T&gt;//取模仿函数</p><p>template&lt;class T&gt; T negate&lt;T&gt;//取反仿函数</p></td></tr></tbody></table><p><span> </span></p><ul><li>6个关系运算类函数对象<span>,</span>每一种都是二元运算。</li></ul><table><tbody><tr><td><p>template&lt;class T&gt; bool equal_to&lt;T&gt;//等于</p><p>template&lt;class T&gt; bool not_equal_to&lt;T&gt;//不等于</p><p>template&lt;class T&gt; bool greater&lt;T&gt;//大于</p><p>template&lt;class T&gt; bool greater_equal&lt;T&gt;//大于等于</p><p>template&lt;class T&gt; bool less&lt;T&gt;//小于</p><p>template&lt;class T&gt; bool less_equal&lt;T&gt;//小于等于</p></td></tr></tbody></table><p><span> </span></p><ul><li>逻辑运算类运算函数<span>,not</span>为一元运算,其余为二元运算。</li></ul><table><tbody><tr><td><p>template&lt;class T&gt; bool logical_and&lt;T&gt;//逻辑与</p><p>template&lt;class T&gt; bool logical_or&lt;T&gt;//逻辑或</p><p>template&lt;class T&gt; bool logical_not&lt;T&gt;//逻辑非</p></td></tr></tbody></table><p><br /></p><p>内建函数对象举例<span>:</span></p><p><br /></p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"e99be001-d4e5-4bd4-a1f8-ee1a2bd715b2\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[//取反仿函数\nvoid test01()\n{\n\tnegate<int> n;\n\tcout << n(50) << endl;\n}\n\n//加法仿函数\nvoid test02()\n{\n\tplus<int> p;\n\tcout << p(10, 20) << endl;\n}\n\n//大于仿函数\nvoid test03()\n{\n\tvector<int> v;\n\tsrand((unsigned int)time(NULL));\n\tfor (int i = 0; i < 10; i++){\n\t\tv.push_back(rand() % 100);\n\t}\n\n\tfor (vector<int>::iterator it = v.begin(); it != v.end(); it++){\n\t\tcout << *it << \" \";\n\t}\n\tcout << endl;\n\tsort(v.begin(), v.end(), greater<int>());\n\n\tfor (vector<int>::iterator it = v.begin(); it != v.end(); it++){\n\t\tcout << *it << \" \";\n\t}\n\tcout << endl;\n\n}\n\n]]></ac:plain-text-body></ac:structured-macro><p>3.1.4 函数对象适配器</p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"234e82d9-2092-4b0b-852d-17789e69b3d6\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[//函数适配器bind1st bind2nd\n//现在我有这个需求 在遍历容器的时候,我希望将容器中的值全部加上100之后显示出来,怎么做?\n//我们直接给函数对象绑定参数 编译阶段就会报错\n//for_each(v.begin(), v.end(), bind2nd(myprint(),100));\n//如果我们想使用绑定适配器,需要我们自己的函数对象继承binary_function 或者 unary_function\n//根据我们函数对象是一元函数对象 还是二元函数对象\nclass MyPrint :public binary_function<int,int,void>\n{\npublic:\n\tvoid operator()(int v1,int v2) const\n\t{\n\t\tcout << \"v1 = : \" << v1 << \" v2 = :\" <<v2 << \" v1+v2 = :\" << (v1 + v2) << endl;\t\n\t}\n};\n//1、函数适配器\nvoid test01()\n{\n\tvector<int>v;\n\tfor (int i = 0; i < 10; i++)\n\t{\n\t\tv.push_back(i);\n\t}\n\tcout << \"请输入起始值:\" << endl;\n\tint x;\n\tcin >> x;\n\n\tfor_each(v.begin(), v.end(), bind1st(MyPrint(), x));\n\t//for_each(v.begin(), v.end(), bind2nd( MyPrint(),x ));\n}\n//总结: bind1st和bind2nd区别?\n//bind1st : 将参数绑定为函数对象的第一个参数\n//bind2nd : 将参数绑定为函数对象的第二个参数\n//bind1st bind2nd将二元函数对象转为一元函数对象\n\n\nclass GreaterThenFive:public unary_function<int,bool>\n{\npublic:\n\tbool operator ()(int v) const\n\t{\n\t\treturn v > 5;\n\t}\n};\n\n//2、取反适配器\nvoid test02()\n{\n\tvector <int> v;\n\tfor (int i = 0; i < 10;i++)\n\t{\n\t\tv.push_back(i);\n\t}\n\t\n// \tvector<int>::iterator it = find_if(v.begin(), v.end(), GreaterThenFive()); //返回第一个大于5的迭代器\n//\tvector<int>::iterator it = find_if(v.begin(), v.end(), not1(GreaterThenFive())); //返回第一个小于5迭代器\n\t//自定义输入\n\tvector<int>::iterator it = find_if(v.begin(), v.end(), not1 ( bind2nd(greater<int>(),5)));\n\tif (it == v.end())\n\t{\n\t\tcout << \"没找到\" << endl;\n\t}\n\telse\n\t{\n\t\tcout << \"找到\" << *it << endl;\n\t}\n\n\t//排序 二元函数对象\n\tsort(v.begin(), v.end(), not2(less<int>()));\n\tfor_each(v.begin(), v.end(), [](int val){cout << val << \" \"; });\n\n}\n//not1 对一元函数对象取反\n//not2 对二元函数对象取反\n\nvoid MyPrint03(int v,int v2)\n{\n\tcout << v + v2<< \" \";\n}\n\n//3、函数指针适配器 ptr_fun\nvoid test03()\n{\n\tvector <int> v;\n\tfor (int i = 0; i < 10; i++)\n\t{\n\t\tv.push_back(i);\n\t}\n\t// ptr_fun( )把一个普通的函数指针适配成函数对象\n\tfor_each(v.begin(), v.end(), bind2nd( ptr_fun( MyPrint03 ), 100));\n}\n\n\n//4、成员函数适配器\nclass Person\n{\npublic:\n\tPerson(string name, int age)\n\t{\n\t\tm_Name = name;\n\t\tm_Age = age;\n\t}\n\n\t//打印函数\n\tvoid ShowPerson(){\n\t\tcout << \"成员函数:\" << \"Name:\" << m_Name << \" Age:\" << m_Age << endl;\n\t}\n\tvoid Plus100()\n\t{\n\t\tm_Age += 100;\n\t}\npublic:\n\tstring m_Name;\n\tint m_Age;\n};\n\nvoid MyPrint04(Person &p)\n{\n\tcout << \"姓名:\" << p.m_Name << \" 年龄:\" << p.m_Age << endl;\n\n};\n\nvoid test04()\n{\n\tvector <Person>v;\n\tPerson p1(\"aaa\", 10);\n\tPerson p2(\"bbb\", 20);\n\tPerson p3(\"ccc\", 30);\n\tPerson p4(\"ddd\", 40);\n\tv.push_back(p1);\n\tv.push_back(p2);\n\tv.push_back(p3);\n\tv.push_back(p4);\n\n\t//for_each(v.begin(), v.end(), MyPrint04);\n\t//利用 mem_fun_ref 将Person内部成员函数适配\n\tfor_each(v.begin(), v.end(), mem_fun_ref(&Person::ShowPerson));\n// \tfor_each(v.begin(), v.end(), mem_fun_ref(&Person::Plus100));\n// \tfor_each(v.begin(), v.end(), mem_fun_ref(&Person::ShowPerson));\n}\n\nvoid test05(){\n\n\tvector<Person*> v1;\n\t//创建数据\n\tPerson p1(\"aaa\", 10);\n\tPerson p2(\"bbb\", 20);\n\tPerson p3(\"ccc\", 30);\n\tPerson p4(\"ddd\", 40);\n\n\tv1.push_back(&p1);\n\tv1.push_back(&p2);\n\tv1.push_back(&p3);\n\tv1.push_back(&p4);\n\n\tfor_each(v1.begin(), v1.end(), mem_fun(&Person::ShowPerson));\n}\n\n//如果容器存放的是对象指针, 那么用mem_fun\n//如果容器中存放的是对象实体,那么用mem_fun_ref]]></ac:plain-text-body></ac:structured-macro><h2><span>4.2 </span>算法概述</h2><p>算法主要是由头文件<span>&lt;algorithm&gt; &lt;functional&gt; &lt;numeric&gt;</span>组成。</p><p>&lt;algorithm&gt;是所有<span>STL</span>头文件中最大的一个<span>,</span>其中常用的功能涉及到比较,交换,查找<span>,</span>遍历,复制,修改,反转,排序,合并等<span>...</span></p><p>&lt;numeric&gt;体积很小,只包括在几个序列容器上进行的简单运算的模板函数<span>.</span></p><p>&lt;functional&gt; 定义了一些模板类<span>,</span>用以声明函数对象。</p><h2><span>4.3 </span>常用遍历算法</h2><table><colgroup><col /></colgroup><tbody><tr><td><p>/*</p><p>    遍历算法 遍历容器元素</p><p>    @param beg 开始迭代器</p><p>    @param end 结束迭代器</p><p>    @param _callback  函数回调或者函数对象</p><p>    @return 函数对象</p><p>*/</p><p>for_each(iterator beg, iterator end, _callback);</p><p>/*</p><p>    transform算法 将指定容器区间元素搬运到另一容器中</p><p>    注意<span> : transform </span>不会给目标容器分配内存,所以需要我们提前分配好内存</p><p>    @param beg1 源容器开始迭代器</p><p>    @param end1 源容器结束迭代器</p><p>    @param beg2 目标容器开始迭代器</p><p>    @param _cakkback 回调函数或者函数对象</p><p>    @return 返回目标容器迭代器</p><p>*/</p><p>transform(iterator beg1, iterator end1, iterator beg2, _callbakc)</p></td></tr></tbody></table><p><span>for_each:</span></p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"f8c6ee83-74bd-4c88-9b51-784b9d6ddc69\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[/*\n\ntemplate<class _InIt,class _Fn1> inline\nvoid for_each(_InIt _First, _InIt _Last, _Fn1 _Func)\n{\n\tfor (; _First != _Last; ++_First)\n\t\t_Func(*_First);\n}\n\n*/\n\n//普通函数\nvoid print01(int val){\n\tcout << val << \" \";\n}\n//函数对象\nstruct print001{\n\tvoid operator()(int val){\n\t\tcout << val << \" \";\n\t}\n};\n\n//for_each算法基本用法\nvoid test01(){\n\t\n\tvector<int> v;\n\tfor (int i = 0; i < 10;i++){\n\t\tv.push_back(i);\n\t}\n\n\t//遍历算法\n\tfor_each(v.begin(), v.end(), print01);\n\tcout << endl;\n\n\tfor_each(v.begin(), v.end(), print001());\n\tcout << endl;\n\n}\n\nstruct print02{\n\tprint02(){\n\t\tmCount = 0;\n\t}\n\tvoid operator()(int val){\n\t\tcout << val << \" \";\n\t\tmCount++;\n\t}\n\tint mCount;\n};\n\n//for_each返回值\nvoid test02(){\n\n\tvector<int> v;\n\tfor (int i = 0; i < 10; i++){\n\t\tv.push_back(i);\n\t}\n\n\tprint02 p = for_each(v.begin(), v.end(), print02());\n\tcout << endl;\n\tcout << p.mCount << endl;\n}\n\nstruct print03 : public binary_function<int, int, void>{\n\tvoid operator()(int val,int bindParam) const{\n\t\tcout << val + bindParam << \" \";\n\t}\n};\n\n//for_each绑定参数输出\nvoid test03(){\n\t\n\tvector<int> v;\n\tfor (int i = 0; i < 10; i++){\n\t\tv.push_back(i);\n\t}\n\n\tfor_each(v.begin(), v.end(), bind2nd(print03(),100));\n}]]></ac:plain-text-body></ac:structured-macro><p><span>transform:</span></p><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"126b7096-1c80-4407-8465-67a0a785ec90\"><ac:parameter ac:name=\"language\">cpp</ac:parameter><ac:plain-text-body><![CDATA[//transform 将一个容器中的值搬运到另一个容器中\n/*\n\ttemplate<class _InIt, class _OutIt, class _Fn1> inline \n\t_OutIt _Transform(_InIt _First, _InIt _Last,_OutIt _Dest, _Fn1 _Func)\n\t{\t\n\n\t\tfor (; _First != _Last; ++_First, ++_Dest)\n\t\t\t*_Dest = _Func(*_First);\n\t\treturn (_Dest);\n\t}\n\n\ttemplate<class _InIt1,class _InIt2,class _OutIt,class _Fn2> inline\n\t_OutIt _Transform(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)\n\t{\t\n\t\tfor (; _First1 != _Last1; ++_First1, ++_First2, ++_Dest)\n\t\t\t*_Dest = _Func(*_First1, *_First2);\n\t\treturn (_Dest);\n\t}\n*/\n\nstruct transformTest01{\n\tint operator()(int val){\n\t\treturn val + 100;\n\t}\n};\nstruct print01{\n\tvoid operator()(int val){\n\t\tcout << val << \" \";\n\t}\n};\nvoid test01(){\n\n\tvector<int> vSource;\n\tfor (int i = 0; i < 10;i ++){\n\t\tvSource.push_back(i + 1);\n\t}\n\n\t//目标容器\n\tvector<int> vTarget;\n\t//给vTarget开辟空间\n\tvTarget.resize(vSource.size());\n\t//将vSource中的元素搬运到vTarget\n\tvector<int>::iterator it = transform(vSource.begin(), vSource.end(), vTarget.begin(), transformTest01());\n\t//打印\n\tfor_each(vTarget.begin(), vTarget.end(), print01()); cout << endl;\n\t\n}\n\n//将容器1和容器2中的元素相加放入到第三个容器中\nstruct transformTest02{\n\tint operator()(int v1,int v2){\n\t\treturn v1 + v2;\n\t}\n};\nvoid test02(){\n\n\tvector<int> vSource1;\n\tvector<int> vSource2;\n\tfor (int i = 0; i < 10; i++){\n\t\tvSource1.push_back(i + 1);\t\n\t}\n\n\t//目标容器\n\tvector<int> vTarget;\n\t//给vTarget开辟空间\n\tvTarget.resize(vSource1.size());\n\ttransform(vSource1.begin(), vSource1.end(), vSource2.begin(),vTarget.begin(), transformTest02());\n\t//打印\n\tfor_each(vTarget.begin(), vTarget.end(), print01()); cout << endl;\n}]]></ac:plain-text-body></ac:structured-macro><h2><span>4.4 </span>常用查找算法</h2><h2><span> </span></h2><table><tbody><tr><td><p>/*</p><p>    find算法 查找元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param value 查找的元素</p><p>    @return 返回查找元素的位置</p><p>*/</p><p>find(iterator beg, iterator end, value)</p><p>/*</p><p>    find_if算法 条件查找</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param  callback 回调函数或者谓词<span>(</span>返回<span>bool</span>类型的函数对象<span>)</span></p><p>    @return bool 查找返回<span>true </span>否则<span>false</span></p><p>*/</p><p>find_if(iterator beg, iterator end, _callback);</p><p><br /></p><p>/*</p><p>    adjacent_find算法 查找相邻重复元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param  _callback 回调函数或者谓词<span>(</span>返回<span>bool</span>类型的函数对象<span>)</span></p><p>    @return 返回相邻元素的第一个位置的迭代器</p><p>*/</p><p>adjacent_find(iterator beg, iterator end, _callback);</p><p>/*</p><p>    binary_search算法 二分查找法</p><p>    注意<span>: </span>在无序序列中不可用</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param value 查找的元素</p><p>    @return bool 查找返回<span>true </span>否则<span>false</span></p><p>*/</p><p>bool binary_search(iterator beg, iterator end, value);</p><p>/*</p><p>    count算法 统计元素出现次数</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param  value回调函数或者谓词<span>(</span>返回<span>bool</span>类型的函数对象<span>)</span></p><p>    @return int返回元素个数</p><p>*/</p><p>count(iterator beg, iterator end, value);</p><p>/*</p><p>count_if算法 统计元素出现次数</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param  callback 回调函数或者谓词<span>(</span>返回<span>bool</span>类型的函数对象<span>)</span></p><p>    @return int返回元素个数</p><p>*/</p><p>count_if(iterator beg, iterator end, _callback);</p></td></tr></tbody></table><p><span> </span></p><h2><span>4.5 </span>常用排序算法</h2><table><tbody><tr><td><p>/*</p><p>    merge算法 容器元素合并,并存储到另一容器中</p><p>    注意<span>:</span>两个容器必须是有序的</p><p>    @param beg1 容器<span>1</span>开始迭代器</p><p>    @param end1 容器<span>1</span>结束迭代器</p><p>    @param beg2 容器<span>2</span>开始迭代器</p><p>    @param end2 容器<span>2</span>结束迭代器</p><p>    @param dest  目标容器开始迭代器</p><p>*/</p><p>merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)</p><p>/*</p><p>    sort算法 容器元素排序</p><p>    @param beg 容器<span>1</span>开始迭代器</p><p>    @param end 容器<span>1</span>结束迭代器</p><p>    @param _callback 回调函数或者谓词<span>(</span>返回<span>bool</span>类型的函数对象<span>)</span></p><p>*/</p><p>sort(iterator beg, iterator end, _callback)</p><p>/*</p><p>    random_shuffle算法 对指定范围内的元素随机调整次序</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>*/</p><p>random_shuffle(iterator beg, iterator end)</p><p>/*</p><p>    reverse算法 反转指定范围的元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>*/</p><p>reverse(iterator beg, iterator end)</p></td></tr></tbody></table><p><span> </span></p><p><span> </span></p><h2><span>4.6 </span>常用拷贝和替换算法</h2><table><colgroup><col /></colgroup><tbody><tr><td><p>/*</p><p>    copy算法 将容器内指定范围的元素拷贝到另一容器中</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param dest 目标起始迭代器</p><p>*/</p><p>copy(iterator beg, iterator end, iterator dest)</p><p>/*</p><p>    replace算法 将容器内指定范围的旧元素修改为新元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param oldvalue 旧元素</p><p>    @param oldvalue 新元素</p><p>*/</p><p>replace(iterator beg, iterator end, oldvalue, newvalue)</p><p>/*</p><p>    replace_if算法 将容器内指定范围满足条件的元素替换为新元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param callback函数回调或者谓词<span>(</span>返回<span>Bool</span>类型的函数对象<span>)</span></p><p>    @param oldvalue 新元素</p><p>*/</p><p>replace_if(iterator beg, iterator end, _callback, newvalue)</p><p>/*</p><p>    swap算法 互换两个容器的元素</p><p>    @param c1容器<span>1</span></p><p>    @param c2容器<span>2</span></p><p>*/</p><p>swap(container c1, container c2)</p></td></tr></tbody></table><p><span> </span></p><h2><span>4.7 </span>常用算数生成算法</h2><table><tbody><tr><td><p>/*</p><p>    accumulate算法 计算容器元素累计总和</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param value累加值</p><p>*/</p><p>accumulate(iterator beg, iterator end, value)</p><p>/*</p><p>    fill算法 向容器中添加元素</p><p>    @param beg 容器开始迭代器</p><p>    @param end 容器结束迭代器</p><p>    @param value t填充元素</p><p>*/</p><p>fill(iterator beg, iterator end, value)</p></td></tr></tbody></table><p><br /></p><p><span> </span></p><h2><span>4.8 </span>常用集合算法</h2><table><colgroup><col /></colgroup><tbody><tr><td><p>/*</p><p>    set_intersection算法 求两个<span>set</span>集合的交集</p><p>    注意<span>:</span>两个集合必须是有序序列</p><p>    @param beg1 容器<span>1</span>开始迭代器</p><p>    @param end1 容器<span>1</span>结束迭代器</p><p>    @param beg2 容器<span>2</span>开始迭代器</p><p>    @param end2 容器<span>2</span>结束迭代器</p><p>    @param dest  目标容器开始迭代器</p><p>    @return 目标容器的最后一个元素的迭代器地址</p><p>*/</p><p>set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)</p><p>/*</p><p>    set_union算法 求两个<span>set</span>集合的并集</p><p>    注意<span>:</span>两个集合必须是有序序列</p><p>    @param beg1 容器<span>1</span>开始迭代器</p><p>    @param end1 容器<span>1</span>结束迭代器</p><p>    @param beg2 容器<span>2</span>开始迭代器</p><p>    @param end2 容器<span>2</span>结束迭代器</p><p>    @param dest  目标容器开始迭代器</p><p>    @return 目标容器的最后一个元素的迭代器地址</p><p>*/</p><p>set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)</p><p>/*</p><p>    set_difference算法 求两个<span>set</span>集合的差集</p><p>    注意<span>:</span>两个集合必须是有序序列</p><p>    @param beg1 容器<span>1</span>开始迭代器</p><p>    @param end1 容器<span>1</span>结束迭代器</p><p>    @param beg2 容器<span>2</span>开始迭代器</p><p>    @param end2 容器<span>2</span>结束迭代器</p><p>    @param dest  目标容器开始迭代器</p><p>    @return 目标容器的最后一个元素的迭代器地址</p><p>*/</p><p>set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)</p></td></tr></tbody></table></ac:layout-cell><ac:layout-cell><p><br /></p></ac:layout-cell></ac:layout-section></ac:layout>","representation":"storage","_expandable":{"content":"/rest/api/content/58954498"}},"_expandable":{"editor":"","view":"","export_view":"","styled_view":"","anonymous_export_view":""}},"extensions":{"position":"none"},"_links":{"webui":"/pages/viewpage.action?pageId=58954498","edit":"/pages/resumedraft.action?draftId=58954498","tinyui":"/x/ApODAw","collection":"/rest/api/content","base":"https://wiki.suncaper.net","context":"","self":"https://wiki.suncaper.net/rest/api/content/58954498"},"_expandable":{"container":"/rest/api/space/2CT","metadata":"","operations":"","children":"/rest/api/content/58954498/child","restrictions":"/rest/api/content/58954498/restriction/byOperation","history":"/rest/api/content/58954498/history","ancestors":"","descendants":"/rest/api/content/58954498/descendant","space":"/rest/api/space/2CT"}}