一、标准库
标准库内容众多,为避免命名冲突,标准库中的内容都被放入命名空间std中。
C++标准发布之前,不带命名空间的旧式C++库(旧式的C++头文件依然被众多编译器支持,只是不在命名空间std中)被应用于大量程序的开发,为兼容这些代码,C++标准委员会为std命名空间中的标准库命名了新的头文件名,命名规制是:
1. 去掉现有C++头文件名中的”.h”。
2. C标准库头文件同样去掉”.h”,并在名字前加一个”c”。
C++ 标准库
C++标准库可以分成两部分:标准函数库和面向对象类库
标准函数库
标准函数库分为以下几类:
- 输入/输出I/O
- 字符串和字符处理
- 数学
- 时间、日期和本地化
- 动态分配
- 其他
- 宽字符函数
面向对象类库
标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O、字符串处理、数值处理。面向对象类库包含以下内容:
- 标准的C++ I/O类
- String类
- 数值类
- STL容器类
- STL算法
- STL函数对象
- STL迭代器
- STL分配器
- 本地化库
- 异常处理类
- 杂项支持类
具体介绍:
- 标准的IO类
对于IO类,常用的库有iostream
<fstream>
提供了对文件的输入输出
<iomanip>
控制输出格式的功能。例如,基于特定的进制数格式化整数,或者控制浮点数的精度。
<ios>
提供了 iostream 需要的一些类型和函数。
<iosfwd>
提供了一些与 I/O 有关的转发操作。
<iostream>
提供了 C++ 输入与输出的基础层。
<istream>
提供了类模板 std::istream 和其他与输入相关的辅助类。
<ostream>
提供了类模板 std::ostream 和其他与输出相关的辅助类。
<sstream>
提供了类模板 std::stringstream 和其他用来处理字符串流的类。
<streambuf>
提供了对字符序列(文件或字符串)进行读写的基础设施。
2、string类
常用的库有string
<string>
提供了 C++ 标准的字符串类和字符串模板。
<regex>
C++11 新增。提供了用正则表达式进行字符串匹配的功能。
3、数值类
使得 C++ 程序可以执行(不完善的)数学运算的组件。
<complex>
复数相关。
<random>
(伪)随机数相关。
<valarray>
定义了五个类模板 valarray,slice_array,gslice_array,mask_array,indirect_array,两个类slice,gslice,还有一系列相关的函数模板。
<numeric>
一些通用的数学运算。
4、STL容器 类
<array>
C++11 新增。提供了容器类模板 std::array,固定大小数组的容器。
<bitset>
提供了专门用来存放位组(一系列 bit)的容器类 std::bitset。
<deque>
提供了双向队列容器类模板 std::deque。
<forward_list>
C++11 新增。提供了单向链表容器类模板 std::forward_list。
<list>
提供了双向链表容器类模板 std::list。
<map>
提供了类模板 std::map 和 std::multimap,前者是有序的一组偶对,后者与前者类似但允许键重复。
<queue>
提供了由 std::duque (经过适配器模式)包装而来的容器类 std::queue,即单向队列。还提供了优先队列std::priority_queue。
<set>
提供了容器类模板 std::set 和 std::multiset。
<stack>
提供了由 std::duque (经过适配器模式)包装而来的容器类 std::stack,即栈。
<unordered_map>
C++11 新增。提供了容器类模板 std::unordered_map 和 std::unordered_multimap,它们都属于哈希表(散列表)。
<unordered_set>
C++11 新增。提供了容器类模板 std::unordered_set 和 std::unordered_multiset。
<vector>
提供了容器类模板 std::vector,即动态数组。
5、STL算法
<algorithm>
标准C++STL库中算法组件为一个很重要的组成部分,该组件提供了大多数最常见的通用算法的实现,并且这些实现是经过很多测试试验并被公认在处理上是高效的。将这些最常见的算法通用化实现,最大的优势就是开发者在应用中不需要为具体的常见算法的实现而费神,只需要包含相应的头文件直接使用即可,不仅仅提高的软件开发的效率,同时还有助于软件重用性的提高。
算法是STL的一个重要组成部分,它提供了数据处理函数,可用于操作各种容器。STL的算法被定义在头文件中。
STL中使用迭代器作为算法与容器间的媒介,算法要求的迭代器一定要与容器的迭代器相匹配,如sort算法使用随机迭代器,而list容器的迭代器仅为向前迭代器,所以sort算法无法在list容器上使用。
6、STL函数对象
7、STL迭代器
每个容器都有自己的迭代器,可以把迭代器看作一个容器所使用的特殊指针,可以存取容器内存储的数据。
使用迭代器可对容器中的数据进行操作。下表列出了主要的操作,其中iter和iter1表示迭代器
迭代器核心代码:
list<int>::iterator list1_iterator ;//定义列表的迭代器,相当于指针
for(list1_iterator=list1.begin(); list1_iterator !=list1.end(); list1_iterator++ )
{
if(*list1_iterator ==100 ) cnt++;
}
- 标准函数库:这个库是通用的、独立的、不属于任何类的函数组成的。函数库继承自C语言
- 面向对象类库:这个库是类及其相关函数的集合
C++标准库包含了所有的C标准库,为了支持类型安全,做了一定的添加和修改。
C++常用的标准库
二、函数
2.1 函数的定义和说明
- C++规定,定义函数时必须指出该函数的返回值类型,没有返回值时,用void进行说明。
- 函数的默认参数
C++语言允许在函数说明或定义时给一个或多个参数指定默认值,使函数调用更加方便灵活。
int fun(int a,int b=5,int c=8); - 说明:
1、指定默认值,要从参数表的右端开始,在指定了默认值的参数的右边不允许出现没有制定默认值的参数
2、在调用函数时,给定的实参值将取代默认值,没给出实参值则使用参数的默认值。
3、如果一个函数需要说明,默认的参数值应该出现在函数的说明而不是函数定义中。 如果函数没有说明则可将默认参数值设置在函数的定义中。
4、默认值可以是数值、表达式、全局变量,但不可以是局部变量。因为默认参数的函数调用是在编译时确定的,而局部变量在编译时无法确定。
总结:
- 对于C++库,直接使用,加上using namespace std;
- 对于C库,举例说明,C语言的库
#include <math.h>
,如果对于C++来说,就换作#include <cmath>
2.2 函数的调用方式
- 传值调用
- 传址调用
- 引用调用、
2.3 函数的嵌套和递归
2.4 内联函数
1、 为什么要用内联函数?
- 函数调用需要一定的时间和空间消耗,对于规模较小且调用频繁的函数可以通过内联函数改善其效率。
- 编译时,编译器将程序中出现的内联函数的调用表达式用该内联函数的函数体进行替换。
2、如何定义内联函数
- 定义内联函数的方法是在函数头前加关键字inline
3、使用内联函数需要注意什么?
- 内联函数不允许有循环和开关语句
- 内联函数的函数体以1~5行为宜
- 类内定义的成员函数都是内联函数
2.5 重载函数
C++允许重载函数,允许一个函数名对应多个不同的函数实现,例如:
- int abs(int);
- long abs(long);
- double abs(double);
重载函数不能只在返回值类型不同!!!
例如:int fun(int ,double)和void fun(int ,double)不能重载!!!
这些函数名称一样,但在参数个数、参数类型等方面会存在不同之处。
三、引用
3.1 引用的定义
- 引用是某个变量或对象的别名。建立引用时,要用某个变量名或对象名对其初始化,于是该引用便绑定在该变量或对象上。
- 引用不是变量或对象,不占内存空间。引用只是作为某个变量或对象的别名使用。引用的值是被引用变量的值,引用的类型是被引用的变量的类型,对引用的修改就是对它所绑定的变量或对象的修改。
3.2 引用使用
- 建立引用:<类型说明符> & <引用名>=<变量名或对象名>
例如:
int a;
int &ra=a;
其中,ra是引用名,即ra是变量a的别名。符号&是说明符,用在引用名前,说明ra是一个引用。注意区分与取地址操作&的差别,取地址符&是运算符,用在变量名前面。 - 引用和指针的区别
指针是变量,引用不是变量。
指针可以被引用,而引用不可以。
指针可以作为数组元素,但不能建立引用数组。
可以有空指针,不能有空引用。
引用一旦初始化,就被绑定在初始化的那个变量或对象上,不再改变。
1. 引用的应用
引用作为函数参数
- 引用作为函数参数可以达到指针作为函数参数的目的:不拷贝副本,在被调用函数中修改调用函数中的实参值。
- 引用作为函数参数时,调用函数的实参与一般传值调用一样使用变量名或对象名。比使用指针作为参数时实参要用地址形式的可读性更好。
引用的程序例子
void swap(int x,int y)
{ int t;
t=x; x=y; y=t;
} //传值
void swap(int *x, int *y)
{ int t;
t=*x; *x=*y; *y=t;
} //传地址
void swap(int& x,int& y)
{ int t;
t=x; x=y; y=t;
} //传引用
main()
{
int a=5,b=6;
…
swap(a,b);
swap(&a, &b);
swap(a,b);
…
printf(“a=%d,b=%d” , a, b);
}