Essential C++ 第3章 泛型编程风格

简介: Essential C++ 第3章 泛型编程风格

第3章 泛型编程风格


Standard Template Library(STL)主要由两种组件构成:一是容器,包括vector、List、set、map等,另一种是操作这些容器的泛型算法(generic algorithm),包括find()、sort()、replace()等。


vector和list是顺序性容器,主要进行迭代操作。

map和set属于关联容器,可以用来快速查找容器中的元素值。

map是一对对的key/value组合。

set只有key。


泛型算法通过function template 技术,达到’与操作对象的类型相互独立’的目的。



3.1 指针的算术运算

3.2 了解Iterator(泛型指针)

3.3所有容器的共通操作:


1、 == 和 !=

2、 =

3、empty()  \\容器为空时返回true

4、size()   \\ 容器内的元素个数

5、clear()      \\ 清空容器


每个容器都提供了begin()和end()函数,指向元素的第一个元素和最后一个元素下一位置的iterator;

insert() 插入一个或一个范围的的元素

erase() 删除某个或某个范围的元素


3.4 使用顺序性容器

使用顺序性容器,首先要包含相应的头文件:

#include<vector>

#include<list>

#include<deque>


产生顺序性容器的方式有五种:

1、产生空的容器

list<string> slist;

vector<int> ivec;

2.产生特定大小的容器, 其中元素以默认值作为初值

list<int> ilist(1024);

vector<string> svec(32);

3、产生特定大小的容器,且为每个元素指定初值

vector<int> ivec(10,-1);

4、通过一对iterator产生容器

int ia[8] = {1,1,2,3,4,5,8,13,21};

vector<int> fib(ia,ia+8);

5、根据某个容器产生

list<string> slist;

//填充slist

list<string> slist2(slist);//将slist复制给slist2



在容器末尾插入:push_back()

在容器某位删除:pop_back()

front()读取最前的值

back()返回最末尾的值


3.5 使用泛型算法

首先包含头文件

#include<algorithm>


四个泛型搜索算法:

find():搜索无序集合中是否包含某值

binary_search() 二分搜索,用于有序集合的搜索。

count() 返回数值相符的元素个数。

search() 查找某个容器内是否存在某个子序列。如果有,则返回指向子序列起始处的itrator,              否则返回容器末尾。



3.6 如何设计一个泛型算法



Function Object

所谓function object,是某种class的实例对象,这类对象对function call运算符做了重载操作,如此一来就可以使function object 当成一般函数来使用。


function object adapter会对function object 进行修改操作。所谓bind adapter会将function object 的参数绑定至特定值。


3.7 使用Map

map被定义为一对数值。

建立map:

#include<map>

#include<string>

map<string,key> words;

输入key/value对:


words[“Vermeer”] = 1;

first,second: map对象的两个成员,first对应key,second对应value。


查询某个key是否在map中:

words.find(“Vermeer”); 如果在,则返回一个iterator,指向key/value的一个pair

否则返回end();

it = words.find(“Vermeer”);

if(it!=words.end())

 count = it->second;

3.8 使用Set

Set是一群key组合而成的。

#include<set>

#include<string>

set<string>word_exclusion;

对于任何key,set只存一份。


为set加入元素

iset.insert(ival);

iset.insert(ver.begin().ver.end());


3.9 如何使用Iterator Inserter

3.10 使用iostream iterator


相关文章
|
5月前
|
编译器 C++
Essential C++ 第5章 面向对象编程风格
Essential C++ 第5章 面向对象编程风格
|
5月前
|
编译器 程序员 C++
C++一分钟之-模板基础:泛型编程
【6月更文挑战第21天】C++模板,泛型编程的关键,让代码跨类型工作,增强重用与灵活性。理解模板基础,如函数和类模板,注意避免特化与偏特化的混淆、编译时膨胀及复杂的错误调试。通过明确特化目的、限制模板使用及应用现代C++技术来优化。示例展示了模板如何自动或显式推导类型。模板元编程虽强大,但初学者宜从基础开始。正确使用模板,提升代码质量,同时保持简洁。
52 3
|
2月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
51 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
38 2
|
4月前
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
62 1
|
5月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
50 1
|
5月前
|
编译器 C++
Essential C++ 第2章 面向过程的编程风格
Essential C++ 第2章 面向过程的编程风格
|
5月前
|
JavaScript 前端开发 编译器
【C++初阶】C++模板编程入门:探索泛型编程的奥秘
【C++初阶】C++模板编程入门:探索泛型编程的奥秘
37 0
|
5月前
|
C++
Essential C++ 第7章 异常处理
Essential C++ 第7章 异常处理