From 629c499a1bcf456259acff7088aaf535c379e6ed Mon Sep 17 00:00:00 2001 From: e2hang <2099307493@qq.com> Date: Tue, 12 Aug 2025 23:00:31 +0800 Subject: [PATCH] STL-related --- STL/STL-Set/README.MD | 298 ++++++++++++++++++++++ STL/STL-Set/set.cpp | 45 ++++ STL/STL-Set/set.exe | Bin 0 -> 2010903 bytes STL/STL-map/README.MD | 303 ++++++++++++++++++++++ STL/STL-map/map.cpp | 7 + STL/STL-priority_queue/README.MD | 421 +++++++++++++++++++++++++++++++ STL/STL-priority_queue/main.cpp | 43 ++++ 特性/auto自动推导.MD | 108 ++++++++ 特性/lambda函数.MD | 138 ++++++++++ 9 files changed, 1363 insertions(+) create mode 100644 STL/STL-Set/set.cpp create mode 100644 STL/STL-Set/set.exe create mode 100644 STL/STL-map/README.MD create mode 100644 STL/STL-map/map.cpp create mode 100644 STL/STL-priority_queue/README.MD create mode 100644 STL/STL-priority_queue/main.cpp create mode 100644 特性/auto自动推导.MD create mode 100644 特性/lambda函数.MD diff --git a/STL/STL-Set/README.MD b/STL/STL-Set/README.MD index e413887..da5e2e9 100644 --- a/STL/STL-Set/README.MD +++ b/STL/STL-Set/README.MD @@ -204,3 +204,301 @@ if (auto [it, ok] = s.insert(10); ok) { * 🧩 `unordered_set` 的比较与选择策略 是否要我继续讲 `multiset` 和 `unordered_set`? + + +
+ {<'a', 1>, <'b', 2>, <'c', 3>}
+ {<'a', 'a'>, <'b', 'b'>, <'c', 'c'>}
++值得一提的是,set 容器定义于+ 对于初学者来说,切勿尝试直接修改 set 容器中已存储元素的值,这很有可能破坏 set 容器中元素的有序性,最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。
+
<set>
头文件,并位于 std 命名空间中。因此如果想在程序中使用 set 容器,该程序代码应先包含如下语句:
++#include <set> +using namespace std;+注意,第二行代码不是必需的,如果不用,则后续程序中在使用 set 容器时,需手动注明 std 命名空间(强烈建议初学者使用)。
+template < class T, // 键 key 和值 value 的类型 + class Compare = less<T>, // 指定 set 容器内部的排序规则 + class Alloc = allocator<T> // 指定分配器对象的类型 + > class set;+注意,由于 set 容器存储的各个键值对,其键和值完全相同,也就意味着它们的类型相同,因此 set 容器类模板的定义中,仅有第 1 个参数用于设定存储数据的类型。
+++ 对于 set 类模板中的 3 个参数,后 2 个参数自带默认值,且几乎所有场景中只需使用前 2 个参数,第 3 个参数不会用到。
+
+std::set<std::string> myset;+
++由此就创建好了一个 set 容器,该容器采用默认的+ 如果程序中已经默认指定了 std 命令空间,这里可以省略 std::。
+
std::less<T>
规则,会对存储的 string 类型元素做升序排序。注意,由于 set 容器支持随时向内部添加新的元素,因此创建空 set 容器的方法是经常使用的。+std::set<std::string> myset{"http://c.biancheng.net/java/", + "http://c.biancheng.net/stl/", + "http://c.biancheng.net/python/"};+由此即创建好了包含 3 个 string 元素的 myset 容器。由于其采用默认的 std::less<T> 规则,因此其内部存储 string 元素的顺序如下所示: +
+ "http://c.biancheng.net/java/"
+ "http://c.biancheng.net/python/"
+ "http://c.biancheng.net/stl/"
+std::set<std::string> copyset(myset); +//等同于 +//std::set<std::string> copyset = myset+该行代码在创建 copyset 容器的基础上,还会将 myset 容器中存储的所有元素,全部复制给 copyset 容器一份。
+set<string> retSet() { + std::set<std::string> myset{ "http://c.biancheng.net/java/", + "http://c.biancheng.net/stl/", + "http://c.biancheng.net/python/" }; + return myset; +} +std::set<std::string> copyset(retSet()); +//或者 +//std::set<std::string> copyset = retSet();+
+ 注意,由于 retSet() 函数的返回值是一个临时 set 容器,因此在初始化 copyset 容器时,其内部调用的是 set 类模板中的移动构造函数,而非拷贝构造函数。
++++ 显然,无论是调用复制构造函数还是调用拷贝构造函数,都必须保证这 2 个容器的类型完全一致。
+
+std::set<std::string> myset{ "http://c.biancheng.net/java/", + "http://c.biancheng.net/stl/", + "http://c.biancheng.net/python/" }; +std::set<std::string> copyset(++myset.begin(), myset.end());+由此初始化的 copyset 容器,其内部仅存有如下 2 个 string 字符串: +
+ "http://c.biancheng.net/python/"
+ "http://c.biancheng.net/stl/"
std::less<T>
规则。其实,借助 set 类模板定义中第 2 个参数,我们完全可以手动修改 set 容器中的排序规则。比如:
++std::set<std::string,std::greater<string> > myset{ + "http://c.biancheng.net/java/", + "http://c.biancheng.net/stl/", + "http://c.biancheng.net/python/"};+通过选用 std::greater<string> 降序规则,myset 容器中元素的存储顺序为: +
+ "http://c.biancheng.net/stl/"
+ "http://c.biancheng.net/python/"
+ "http://c.biancheng.net/java/"
+ 成员方法 | ++ 功能 | +
---|---|
+ begin() | ++ 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 | +
+ end() | ++ 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 | +
+ rbegin() | ++ 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 | +
+ rend() | ++ 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 | +
+ cbegin() | ++ 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 | +
+ cend() | ++ 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 | +
+ crbegin() | ++ 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 | +
+ crend() | ++ 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 | +
+ find(val) | ++ 在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 | +
+ lower_bound(val) | ++ 返回一个指向当前 set 容器中第一个大于或等于 val 的元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 | +
+ upper_bound(val) | ++ 返回一个指向当前 set 容器中第一个大于 val 的元素的迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 | +
+ equal_range(val) | ++ 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的值为 val 的元素(set 容器中各个元素是唯一的,因此该范围最多包含一个元素)。 | +
+ empty() | ++ 若容器为空,则返回 true;否则 false。 | +
+ size() | ++ 返回当前 set 容器中存有元素的个数。 | +
+ max_size() | ++ 返回 set 容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同。 | +
+ insert() | ++ 向 set 容器中插入元素。 | +
+ erase() | ++ 删除 set 容器中存储的元素。 | +
+ swap() | ++ 交换 2 个 set 容器中存储的所有元素。这意味着,操作的 2 个 set 容器的类型必须相同。 | +
+ clear() | ++ 清空 set 容器中所有的元素,即令 set 容器的 size() 为 0。 | +
+ emplace() | ++ 在当前 set 容器中的指定位置直接构造新元素。其效果和 insert() 一样,但效率更高。 | +
+ emplace_hint() | ++ 在本质上和 emplace() 在 set 容器中构造新元素的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示新元素生成位置的迭代器,并作为该方法的第一个参数。 | +
+ count(val) | ++ 在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1。 | +
+#include <iostream> +#include <set> +#include <string> +using namespace std; + +int main() +{ + //创建空set容器 + std::set<std::string> myset; + //空set容器不存储任何元素 + cout << "1、myset size = " << myset.size() << endl; + //向myset容器中插入新元素 + myset.insert("http://c.biancheng.net/java/"); + myset.insert("http://c.biancheng.net/stl/"); + myset.insert("http://c.biancheng.net/python/"); + cout << "2、myset size = " << myset.size() << endl; + //利用双向迭代器,遍历myset + for (auto iter = myset.begin(); iter != myset.end(); ++iter) { + cout << *iter << endl; + } + return 0; +}+程序执行结果为: +
+ 1、myset size = 0
+ 2、myset size = 3
+ http://c.biancheng.net/java/
+ http://c.biancheng.net/python/
+ http://c.biancheng.net/stl/
+++ 有关表 1 中其它成员方法的用法,后续章节会做详细讲解。
+
Q?
zd+@-2r2uN<@vQINUHI~N@}*eS<*gt|UeZbw+?Mv9Zk^Sw{9V+}(`|Oz^B>&i=XUTE
z?gi$ZFWP(Vppbv(U$5W=vx0b+GaNjVMDh+k(*I5JR88u2{<*<(QMkRz>+wti%qUz(
z;hOfZ)HA)N*A)tI(h9t&$?
z`zJ~lyh8sKJf&jpE_y3%$-vNhprFT6PHdhyG4xy0ZQ{V@i33xEc|^P?BwkYWoxwmD
zSUk?|gvd9gf%y3an2t6;#Uheye=T5a4H%zVYeBF%7M8X;JAQrBo;`bhUVlWx(P8`x
zTE>dnuX7&@1C{2-RA6kDuKB6*{aIeU{|7TqHHYM(JK7~Bqnkr=^j2*uj9n6XYON_(bIE@f%Jf!4a_T^W
zcTP?c+=tl>*5qp#)eg`jyRv5Vd_F6wzq)r58^Kg&e@scN*fpy2K}Q?iI43u8{c_Az
zJqg6c{jFlQQ_qDjT!yH;RQ(XiN!1S_>mK`bs2MFP=} `^Kg1F 6<}dYnL{tK2b4;f_)J_0|4kbygMSn~DE{-^U;Cx8zzS0$l#|
ze&U5G-uEegs
z=LpyhD0FC>uE1E526nQ5{R@RoH!f0OECHA+w{yUP>ibwBb;48^bfG_%h3<}p$$6@D
ze<>}Wo~VFS
oct&qXRXz%Yg;@fYu-DS
z&5xa)R&*_pMQcL$!LC02md>N&I$W%=?-CEyIhLmgl?zZlmJJGx@=2i5EqXx}RVB($
zWfI%1izpI13yJ(IBwj|;jqeGGw?3jsG`o;QRjp}^&{yR?Zw49=_ZW!tE8
0754vKkT5
z;D-6KP83)5^)lQWA0*Dyjg@HDb?4`wo$X2VR%NcUtzwxbWvXMJ-km~uWg5y0d2f8c
zmU@&D>RtC=<>(d*!0BqY-_I-Qc1dl?}Qv_Je={y3Da#K;P4>b=z5#b$NpxuY4Ni
zA2@D&gA%cTtOQ8nP(_RsJjXh!(HFl~0j+ofTg-@fmATfz0CdA$^LJ$wKCKaO@3S>0
zM81geLuQ>mpdH#hHV?Gt11z6(KlK9{uLa3@U}d{Qw(8OH?RvZ_M-_u<)y82oVYU%j
z)u#omO33gJ96U2PXHcu&E^7X^)TK+%k`U4*Y>|So_^))}vk}tt7T_*T;@)fRLNT1o
z+W-2~wNKnj?a7(7|CCOwKVz>taVXI{YSaD9W;(Gy3LKqy5HlV2V7g8u`!G=oX^EuD
zgj&@(@1fJ(@
WK7Q>pRGdd
z*>>klgxk^Q%_^6)sO+YZ?e~?Ux)J$#RJK=2^C4`gYZI}~Ejd`5$1SQA)!&4#?bVd8
zMgK$HWX9mmG&;RM{o!~nwZ5T6X>@;4{%OL?Cb^w6S=f#~u|1h(AF=Ek3dRxV&oXpN
z7iTXe&R!hzAR|$(MLm$3Gf=sk^`Aifw6+(p?2gQ`Aj>k14rXzaDQ2+{7i$zCTu*TP
zpU&R~Pfp2d!#)hWpCUI74cb(1xQA+jqjjo
zo8)nwCUZ3i&17t*avkv}(Dz7VwibN^orR?WE%pL#bn~>_NPkQa9!88cy%DQhWLNf#
ztL;1R&WR5`d=BC_zGi}sO9*Z%zm)3)rIOU=9TpS(*;ova)dYX`c;1c2KGwDZrhBnt
zGLVhbPPQzw1n_`029^CWD{|bHXCmwSTXyIMyQd1fuBuxfg7{NFd>-g3k8KO~^~FON
zs{f?de%ab@`uk!vrY7_yMVwC&FWn%nt*`FLe*w5l)H?}W`)SBhB5r)p-{)Y&23GnG^Be9*Vdexr*zwufW6W
zU^d(z>$K0(-E$mC)a?`^7!7T<4{_SJ5E_Xwe3up|=%X9Kf@0*hI2ub+(FQ0A
k{tWvAiJG=xnTOU_{n)dOoZFxXx+2C@zY-oHx_C0`$~Dop2y4a3^?KaCf)ls
z&g0FftYuW@Mz^w(leGD}Xut6;OQmj2#`o&j%rX|0QuZD{Ezg<>=f~{q!dF>Qyb>tm
zSwVXIYS20dZVDT#?ngm<3Q}X+Qt=JnK|m#<^YE&qU^%+n6Uw*WM|5%YPg}BI_dtBO
z7l(9o3hyomb_^J=^-uVWkFMRSS0kP_mK$5Bd43AU*sQmjljrZTRrv%qtVNFpYWymx
z7X1`hx$Wc>G{P!3U5P5r?yxoh0?dt
?0|yK{0~k{M`z~Y
zhg3Q<+|$vSpGjP(t23wS&~@t&?&M>(1MV0nXlfK^P?&yKA>&=K|AG3X&XjWJmJ3OO
zOp}*0pV8jr&$UEAa_GG=^EIxNjqocO5;x#%0HncD$hHaTD*mQCDpa(l_D^F=OqIR6
zoSDQxHfD;Sk?kYSDU+NkhN@l;&8JR;klp#0aU#Tl&@0a7gP&w4pH1ltANI7K;9W=4
zM*S)VhXn$q4@Og)3OfEwNFy=is-7vGAdbf9<)8x3iX0#JFLEH*I?s=LnS_)|c;#C`
zh_W(s|D
o1xM-2c6L)8R=Xy{OIc$Cw
zR9jD&iVer-WqvH15DF;D?iPIU?t@GaJ?{1d>z^x?MHYRBL=}3^?%D$1VrENn8j|6k
zz%e>(fxRAgTQv
zPI)ajkbqy>9Z&FhAn|CM>bZLt^kJF@1zWm#r5}$Tp?&)BxqSsFiX6@k-(}1{i5^#)
zYbs}~6vRc>R2l*H$+9OmGfy8j15y+guA#L3Um7zOq?MsiZLDh{1_%wK3!NZ^8l~Tf
zo`04FkJgGd86#^3W^~-Crz&UPF;$4g>Q>Q8PWw@*qFdknTwq8|%f!_gAI6vt%SJF*
zmx)cD=-HD7EV*k`WSjhh
%lYKS^I5c{QH1
61+qev1yP-R@*A&?aY?+S-
z5|1n`O6EWmMS-&KLjQ8jZJ8Zega0mmlJHhJ)2Xw8+7vzZoy-OZ4Nk7MS=5A?_PIWm
z`->6LfbdnI_zPZT#-+ui?EdZI4{-Ev-$JSr#7qA`jwnYZZ>2KXUq@wjpk~-$V}ZX<
z_q6Y+`*H_vWjlgk
LTyjMDCzK+49M~OV`v50-$E(khjwN8EN5N2Zo)F_joV-
zSCzOPx@))PqC7FnAZMHSGK`2B9pcBCA_VPQB#-CHrPyMIWCm-lD+Ij?wFmqK*_olt
zN?B;7o|i<$v_0?AlM8L4kCy
z#Nms->r+hIbqI_5zkw6tp7