前面学习过各种容器,和容器的常用API调用练习,还涉及一点仿函数。这篇开始学习C++中STL提供的一些常用的算法,这些算法都是采用模板类实现,调用这些算法的过程中,很多需要传入一个函数对象作为参数,可以是普通的函数,也可以是仿函数。这篇学习常用遍历容器的算法 for_each,和搬运算法transform
概述:
算法主要是由头文件
<algorithm> <functional> <numeric>
组成
<algorithm>是所有STL头文件中最大的一个,范围涉及比较,交换,查找,遍历操作,复制,修改等
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
<functional>定义了一些模板类,用以声明函数对象
接下来学习的算法,需要引入这些头文件才能识别。
1.常用算法 for_each //遍历容器算法
容器遍历是在实际开发中使用最多的算法之一,除了我们自己写for循环,这里学习最常用的for_each算法。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// for_each遍历容器算法
// 仿函数
class print01
public:
void operator()(int val)
cout << val << " ";
//普通函数
void print02(int val)
cout << val << " ";
void test01()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
// 普通for循环遍历
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
void test02()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
// for_each循环,场景1:使用仿函数
for_each(v.begin(), v.end(), print01());
void test03()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
// for_each循环,场景2:使用普通函数
for_each(v.begin(), v.end(), print02);
int main()
test01();
test02();
cout << endl;
test03();
cout << endl;
system("pause");
return 0;
上面写三段测试代码,第一段是普通的for循环遍历,这种遍历前面一直在使用。后面两种使用for_each算法,第三个参数可以是普通的函数,也可以是仿函数,注意仿函数和普通函数的写法区别。
如果是普通函数,第三个参数就写函数名称就好,如果是仿函数就写函数对象(带小括号),上面print01()是一个类print01的匿名仿函数写法。
2.常用算法 transform //搬运容器到另一个容器中
算法transform作用是搬运一个容器到另外一个容器中。
第四个参数可以是一个仿函数或回调函数。例如在遍历过程,可以对元素进行操作,这里来举例,加法操作,每个元素+2,加入容器元素的数据类型是int
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// transform 搬运容器算法
//普通函数
int fun(int val)
val += 2;
return val;
void print01(int val)
cout << val << " ";
void test01()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
//搬运容器测试
vector<int> v2;
//一般需要先把v2容器设置成v的大小
v2.resize(v.size());
transform(v.begin(), v.end(), v2.begin(), fun);
//遍历一下v2
for_each(v2.begin(), v2.end(), print01);
cout << endl;
int main()
test01();
system("pause");
return 0;
测试结果,v2容器已经把v容器搬运过来,并对元素都+2操作
前面学习过各种容器,和容器的常用API调用练习,还涉及一点仿函数。这篇开始学习C++中STL提供的一些常用的算法,这些算法都是采用模板类实现,调用这些算法的过程中,很多需要传入一个函数对象作为参数,可以是普通的函数,也可以是仿函数。这篇学习常用遍历容器的算法 for_each,和搬运算法transform概述:算法主要是由头文件<algorithm> <functional> <numeric>组成<algorithm>是所有STL头文件中最大的.
C++ STL标准模板库在数据结构和算法的实践领域发挥着重要的作用。本书共分5篇26章,以“C++编程技术→C++ STL泛化技术基础→C++ STL容器技术→C++ STL算法技术→C++ STL迭代器技术”为线索具体展开,通过大量的源码分析和应用实例,详细介绍了C++ STL的技术原理和使用方法。 通过本书的学习,读者不仅可以轻松掌握C++ STL,还可以从它的一流源代码中受益匪浅。本书可用作高等院校计算机及相关专业的教学参考书。也适合各层次的C++开发人员和爱好者为锤炼自身的C++基本功阅读使用。
第一篇 预备知识 1
第1章 C++编程技术 2
1.1 类和对象 2
1.2 类的继承 5
1.3 函数重载 5
1.4 访问控制 7
1.5 操作符重载 8
1.6 显式类型转换 9
1.7 异常处理 13
1.8 名字空间 17
1.9 友员函数 20
1.10 内联函数 21
1.11 静态成员 22
1.12 本章小结 23
第2章 C++模板技术 25
2.1 函数模板 25
2.2 类模板 27
2.3 模板完全特化 28
2.4 函数模板重载 30
2.5 类模板继承 30
2.6 本章小结 31
第3章 C++ I/O流技术 32
3.1 I/O流类 32
3.2 标准输入输出 34
3.3 文件输入输出 36
3.4 流的格式控制 41
3.5 本章小结 45
第二篇 C++ STL泛化技术基础 47
第4章 C++ STL泛型库概述 48
4.1 C++ STL的发展历程 48
4.2 C++ STL的各种实现版本 49
4.2.1 HP STL 49
4.2.2 SGI STL 50
4.2.3 STLport 50
4.2.4 P.J.Plauger STL 50
4.2.5 Rouge Wave STL 50
4.3 C++ STL的Visual C++编译 50
4.4 C++ STL的体系结构 52
4.4.1 容器(Container) 52
4.4.2 迭代器(Iterator) 53
4.4.3 算法(Algorithm) 53
4.4.4 函数对象(Function Object) 54
4.4.5 适配器(Adapter) 55
4.4.6 内存分配器(Allocator) 56
4.4.7 概念(Concept)和模型(Model) 56
4.5 C++ STL存在的一些问题 57
4.6 本章小结 57
第5章 C++ STL泛化技术分析 58
5.1 算法和迭代器 58
5.1.1 算法 58
5.1.2 迭代器 61
5.1.3 函数对象 65
5.1.4 适配器 68
5.2 内存分配器和容器 74
5.2.1 内存分配器 75
5.2.2 容器 77
5.3 概念 82
5.3.1 基础性概念 82
5.3.2 容器概念 84
5.3.3 迭代器概念 86
5.3.4 函数对象概念 88
5.4 本章小结 89
第三篇 C++ STL容器技术 91
第6章 vector向量容器 92
6.1 vector技术原理 92
6.2 vector应用基础 94
6.3 本章小结 101
第7章 deque双端队列容器 102
7.1 deque技术原理 102
7.2 deque应用基础 108
7.3 本章小结 115
第8章 list双向链表容器 116
8.1 list技术原理 116
8.2 list应用基础 124
8.3 本章小结 131
第9章 slist单向链表容器 132
9.1 slist技术原理 132
9.2 slist应用基础 140
9.3 本章小结 148
第10章 bit_vector位向量容器 149
10.1 bit_vector技术原理 149
10.2 bit_vector应用基础 156
10.3 本章小结 161
第11章 set集合容器 162
11.1 set技术原理 162
11.2 set应用基础 181
11.3 本章小结 186
第12章 multiset多重集合容器 187
12.1 multiset技术原理 187
12.2 multiset应用基础 190
12.3 本章小结 196
第13章 map映照容器 197
13.1 map技术原理 197
13.2 map应用基础 200
13.3 本章小结 206
第14章 multimap多重映照容器 207
14.1 multimap技术原理 207
14.2 multimap应用基础 210
14.3 本章小结 216
第15章 hash_set哈希集合容器 217
15.1 hash_set技术原理 217
15.2 hash_set应用基础 230
15.3 本章小结 234
第16章 hash_map哈希映照容器 235
16.1 hash_map技术原理 235
16.2 hash_map应用基础 237
16.3 本章小结 242
第17章 string基本字符序列容器 243
17.1 string技术原理 243
17.2 string应用基础 258
17.3 本章小结 264
第18章 stack堆栈容器 265
18.1 stack技术原理 265
18.2 stack应用基础 266
18.3 本章小结 269
第19章 queue队列容器 270
19.1 queue技术原理 270
19.2 queue应用基础 271
19.3 本章小结 274
第20章 priority_queue优先队列容器 275
20.1 priority_queue技术原理 275
20.2 priority_queue应用基础 278
20.3 本章小结 281
第四篇 C++ STL算法技术 283
第21章 非变易算法 284
21.1 逐个容器元素for_each 284
21.2 查找容器元素find 285
21.3 条件查找容器元素find_if 286
21.4 邻近查找容器元素adjacent_find 287
21.5 范围查找容器元素find_first_of 289
21.6 统计等于某值的容器元素个数count 290
21.7 条件统计容器元素个数count_if 291
21.8 元素不匹配查找mismatch 293
21.9 元素相等判断equal 295
21.10 子序列搜索search 296
21.11 重复元素子序列搜索search_n 299
21.12 最后一个子序列搜索find_end 301
21.13 本章小结 303
第22章 变易算法 304
22.1 元素复制copy 304
22.2 反向复制copy_backward 305
22.3 元素交换swap 306
22.4 迭代器交换iter_swap 307
22.5 区间元素交换swap_ranges 308
22.6 元素变换transform 309
22.7 替换 310
22.8 条件替换replace_if 311
22.9 替换和复制replace_copy 312
22.10 条件替换和复制replace_copy_if 313
22.11 填充fill 314
22.12 n次填充fill_n 315
22.13 随机生成元素generate 316
22.14 随机生成n个元素generate_n 317
22.15 移除复制remove_copy 318
22.16 条件移除复制remove_copy_if 319
22.17 移除remove 320
22.18 条件移除remove_if 321
22.19 不连续重复元素复制unique_copy 322
22.20 剔除连续重复元素unique 324
22.21 元素反向reverse 325
22.22 反向复制reverse_copy 326
22.23 旋转rotate 327
22.24 旋转复制rotate_copy 329
22.25 随机抖动random_shuffle 330
22.26 随机采样random_sample 331
22.27 容器分割partition 333
22.28 容器稳定分割stable_partition 335
22.29 本章小结 338
第23章 排序算法 339
23.1 元素入堆push_heap 339
23.2 创建堆make_heap 343
23.3 元素出堆pop_heap 348
23.4 堆排序sort_heap 351
23.5 是否为堆is_heap 352
23.6 局部排序partial_sort 354
23.7 局部排序复制partial_sort_copy 356
23.8 排序sort 359
23.9 归并merge 366
23.10 内部归并inplace_merge 368
23.11 稳定排序stable_sort 376
23.12 是否排序is_sorted 383
23.13 第n个元素nth_element 384
23.14 下确界lower_bound 386
23.15 上确界upper_bound 388
23.16 等价区间equal_range 390
23.17 折半搜索binary_search 392
23.18 子集合includes 393
23.19 集合求并set_union 394
23.20 集合求交set_ intersection 396
23.21 集合求差set_difference 398
23.22 集合求异set_symmetric_difference 399
23.23 最小值min 401
23.24 最大值max 402
23.25 最小元素min_element 403
23.26 最大元素max_element 404
23.27 字典比较lexicographical_compare 405
23.28 下一排列组合next_permutation 406
23.29 上一排列组合prev_permutation 409
23.30 本章小结 411
第24章 数值算法 412
24.1 递增赋值iota 412
24.2 元素求和accumulate 413
24.3 两序列元素内积inner_product 414
24.4 部分元素求和partial_sum 415
24.5 相邻元素求差adjacent_difference 417
24.6 n次方计算power 419
24.7 本章小结 421
第五篇 C++ STL迭代器技术 423
第25章 输入输出流迭代器 424
25.1 输入流迭代器 424
25.2 输出流迭代器 426
25.3 本章小结 427
第26章 插入/反向/存储迭代器 428
26.1 向前插入迭代器 428
26.2 向后插入迭代器 429
26.3 插入迭代器 431
26.4 反向迭代器 432
26.5 反向双向迭代器 434
26.6 原始存储迭代器 435
26.7 本章小结 437
附录 STL版权说明 438
函数原型:for_each (InputIterator beg, InputIterator end, UnaryProc op)
函数功能:对区间[beg,end)中的所有元素执行 op操作。
注意:op操作的返回值会被忽略。
using std...
//for_each()调用三次析构函数
仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。
1)公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就
transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。
每个元素都可以在放进一个函数里做对应的修改
参考:http://c.biancheng.net/view/623.html
C++ STL是C++标准库的一部分,包含了许多常用的数据结构和算法,如vector、list、map、set等。STL的设计目的是提供高效、可靠、通用的数据结构和算法,使得程序员可以更加方便地编写高质量的代码。
map和unordered_map是STL中的两种关联容器,它们都可以用于存储键值对。map是一种有序的关联容器,它使用红黑树实现,可以快速地查找、插入和删除元素,但是它的空间复杂度较高。unordered_map是一种无序的关联容器,它使用哈希表实现,可以在常数时间内查找、插入和删除元素,但是它的空间复杂度较低。
在使用map和unordered_map时,需要注意它们的特点和适用场景。如果需要有序地存储键值对,并且需要快速地查找、插入和删除元素,那么应该选择map;如果不需要有序地存储键值对,并且需要在常数时间内查找、插入和删除元素,那么应该选择unordered_map。