stl源码剖析_《STL源码剖析》第6章算法

6.1算法概观

1)算法总览

6522ab0ed331c84926307303fa9f58ed.png

56c3ca579a79f59bb913e3a1bffae2d9.png

23cc9ab96cda439f0874077bd2a9bede.png

1dfb10e727cca2816199bb5e8237d1ad.png

2)质变算法

所有的STL算法都作用在又迭代器[first,lasr)所标示出来的区间上。所谓质变算法,是指运算过程中会更改区间内(迭代器所指)的元素内容。如拷贝(copy)、互换(swap),替换(replace)等。通常提供两个版本,一个是in_place(就地进行)版,就地改变其操作对象;另一个是copy(另地进行)版,将操作对象的内容复制一份副本,然后在副本上进行修改并返回该副本。

  1. 非质变算法

所有的STL算法都作用在又迭代器[first,lasr)所标示出来的区间上。所谓非质变算法,是指运算过程中不会更改区间内(迭代器所指)的元素内容。如查找(find)、匹配(search)、计数(count)、巡访(for_each)等。

6.2算法的泛化过程

泛化:把操作对象的型别加以抽象化,把操作对象的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了。整个过程称为算法的泛型化(generalized),简称泛化。

如:完全泛型化的find()函数

template<class Iterator, class T>

iterator find(Iterator begin, Iterator end, const T& value){

While( begin != end && *begin != value){

++begin;}

return begin; }

6.4基本算法

1)运用实例

e10b0ea6a68e018f6f67575a47830806.png

de0b18ae77a29886039a8d1917194835.png

2)解释

1dedd86e8e2f2f16f13ee0543ae8bf46.png

0f850329d234cd233a1a565fcf4578ff.png

e4b3193e936f286dbf1570a9ab34299a.png

6d339ff87605afde62628e580ece91b4.png

77418c5baa6124692458ffa02d757e68.png

31163a7d0bb28744098f94e87bb00699.png

ec6b9a3168c6bc5c22c6b76dcb273a5d.png

b01f23c64e4a40544902fce38464d9ba.png

cfe654f4fc68660c3659be1d3aa6b43b.png

91ea5cb8a319b476f6ff6dcea43f0917.png
  1. copy-强化效率无所不有其极

0383f57b3e5248292799a06840998800.png

5d6e5c1405f2ea1bf17ae80660d1a769.png

5ced1fe5ddede454ed3121ed2da2525f.png

c859713732331fd0e2a04a6ff31ecd32.png

290ff809be7cf990814f16a145971e5c.png

6.5 set算法

1)运用实例

a71fc4a9d62efba530a38e7f04e93c8d.png

4b02c73a48f2022e7530b71486234bf5.png

fda3b441372d63fcb155b55a97ab2ef2.png

3b071da7acc40877245b589a8f82c622.png

0c94ba70ac417bfde4496d49fd7c93ba.png

2)解释

并集

d0b9e11c13d2894114175b3d34163e52.png

交集

60b1b0afe2b4cc9c24bea5fe356b1f1a.png

540a30691ba4fe4b6d3bd6551f68f71f.png

差集

693232d22bbbd5b35350b41f9b0146a2.png

对称差集

73f644f752f626eca2b1b071105f615e.png

6.6 heap算法

ca59860342deaffa480b699c8d5e824b.png

1)单纯的数据处理

e1ffea6bb76e61020d509d2992b11b50.png

391ce5db370d1e6b7f3f26cf3161452d.png

303242f14bbe350427ae43f869a6d924.png

8f81fb38dd0f0e2d313951996d265715.png

30040a30a45b3d3ec94324877159d5e7.png

aa52472cd70a71c843e51e3a44cbc304.png

bdfb3da7d4e6ab61033a97efa87f1acf.png

5ae0a990a1319a5ffd8bfe7966b5d1b3.png

f6542043ed0a8a142f16a87c41a0fc1c.png

ffdf1f13e9a013cec776535cdb6e831a.png

b30f16b091a1a98ecd8b23c6b6f98846.png

4dc26b705ae67d97192943653b882773.png

32ca38129111869d8ea88f3faa6e9340.png

497d5f7f1afd502ca7b12305bcda7f87.png

5be3c31b542bfe668cbcccf7668825dc.png

0d79b7e444284c0316609bf3b9f3ae23.png

30b4bf18d3901ae5677104fc1942f76e.png

316f6d4e894eefd1d1e0a08f27659769.png

24eccb40382d886c4656e531a28206fb.png

d5210daf8486e6b148cd4a8e8095c868.png

322a40838f3b94e3c9e56f76dd4b3324.png

bc781090a8977e9c471b65709cc30cd4.png

934589f2a8ddbc78cd0071db65c622a9.png

c1e58a9fe7799ceabc186bf24a7bd8f3.png

945ff39238c698ae94482db054214f36.png

5fcbbdb43accec5780c511c64e2e6339.png

de6266abb26ce7cc5a53e8ae6cb28da6.png

7f5c206699adf4848cb02569ad5d78c9.png

e06ab04f0a5ee9c57aa53d8f3e3cdadd.png

6c0d45b7acc875b07b54a2dd7610b4b6.png

71037c9dc4f4ce7f325d9f564a2b845d.png

395ad019876a6bc20ee6204d50499f6b.png

fa445f3e7fe66c8a720c0dce6c8864a3.png

a1afbb38772cf1e6d1680571307ecef1.png

1e5a9a57bae3e251fa6f9862c12059b3.png

fb461ca146fcc2b8844660cc69e98435.png

460f094395cce548910bad1c9578042e.png

7be2187ea3872b8814b92cfaea4fdce0.png

2107e492cc599655f2659e505fa24d19.png

ce0348e1c6e4b98a88b415eef40a0311.png

6.7 其他算法

2)lower_bound (应用于有序区间)

寻找[first ,last)中第一个大于等于(>=)value值元素出现的位置。即它返回一个迭代器,指向第一个“不小于value”的元素

89a00fc89f6c011dd7f83b5b6368db81.png

3)upper_bound(应用于有序区间)

该算法是二分查找法的一个版本,寻找[first ,last)中第一个大于value的元素的位置。更确切地说,它会返回“在不破坏顺序的情况下,可插入value的最后一个合适位置”。

e1dd7f14b65d8be521271c4dc24ebcc4.png

4)binary_search(应用于有序区间)

ae5b7200781b35983fde843ec03bab98.png

5)next_permutation 下一个排列组合

3d3cd9cec48fb52abc1372220d8ac350.png

a8fa5659c6c246ae0b9ffa0a5e7c1a5e.png

6)prev_permutation(前一个排列组合)

387bf50e0f5173f20a00c1ccfae75815.png

0b85f21d433217da22a9ec34b0cecac0.png

7)random_shuffle 随机重排

8e3cfd034de618600d116fd560777f88.png

6f4f50d63a516fcab85cdb87aa66a84e.png

43187dd91456ef9bc25974009eb41747.png

8)partial_sort/partial_sort_copy

接受一个middle迭代器,然后重新对[first,last)内的元素进行排序。[first,middle)内是递增顺序,[middle,last)顺序不一定。

7270be2f35d431c9ce945462396fa8f1.png

d3cce3d5722fcab432e5da73c5950be4.png

b958be9474095946c818412e21a2d4ee.png

9)sort (只能在vector和deque上使用)

因为这两个容器才有RandomAccessIterator随机存取迭代器。

4ad9372d683020742d4427218d69f271.png

e6411bd9c9241e2f9de8246920325b8a.png

d341272883acce3f6980f7b2ac1047fa.png

a34127587bea6e4ace85a77ce3d0088f.png

8cfe60235c149765adbabc7a12b9d7cc.png

3db4ea2a795c42e318133395764affc6.png

b57d249b27a3193f5c879d39df5633ff.png

986691f4b13b9ca7626861d41e8eb0fe.png

fe1ead4aeebadbe7e21a09cb341464d6.png

10)equal_range(应用于有序区间)

5f01fb0c6248275f2a67e1089fb2dffa.png

9e41a52c061a80c81ebbf200e116c0c0.png

11) inplace_merge(应用于有序区间)

afe976a167ab2ffa54ac92ae48f1a601.png

12)nth_element

aec4124e71151d9efc4ec2059075bc18.png

62d9fec4bf1b1dab90fe0be9fc8222ab.png

baa76f7083202649481540cb8fde0312.png

13) merge sort

305aa0a6a1446ade3d4e2a9d6986b563.png

cbb80bb16952feb3953181911c971dfc.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值