13b3ebbe14
把川大 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 运行通过。
1 line
26 KiB
JSON
1 line
26 KiB
JSON
{"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<functional>。</p><p><span> </span></p><ul><li>6个算数类函数对象<span>,</span>除了<span>negate</span>是一元运算,其他都是二元运算。</li></ul><table><tbody><tr><td><p>template<class T> T plus<T>//加法仿函数</p><p>template<class T> T minus<T>//减法仿函数</p><p>template<class T> T multiplies<T>//乘法仿函数</p><p>template<class T> T divides<T>//除法仿函数</p><p>template<class T> T modulus<T>//取模仿函数</p><p>template<class T> T negate<T>//取反仿函数</p></td></tr></tbody></table><p><span> </span></p><ul><li>6个关系运算类函数对象<span>,</span>每一种都是二元运算。</li></ul><table><tbody><tr><td><p>template<class T> bool equal_to<T>//等于</p><p>template<class T> bool not_equal_to<T>//不等于</p><p>template<class T> bool greater<T>//大于</p><p>template<class T> bool greater_equal<T>//大于等于</p><p>template<class T> bool less<T>//小于</p><p>template<class T> bool less_equal<T>//小于等于</p></td></tr></tbody></table><p><span> </span></p><ul><li>逻辑运算类运算函数<span>,not</span>为一元运算,其余为二元运算。</li></ul><table><tbody><tr><td><p>template<class T> bool logical_and<T>//逻辑与</p><p>template<class T> bool logical_or<T>//逻辑或</p><p>template<class T> bool logical_not<T>//逻辑非</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><{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><algorithm> <functional> <numeric></span>组成。</p><p><algorithm>是所有<span>STL</span>头文件中最大的一个<span>,</span>其中常用的功能涉及到比较,交换,查找<span>,</span>遍历,复制,修改,反转,排序,合并等<span>...</span></p><p><numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数<span>.</span></p><p><functional> 定义了一些模板类<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"}} |