一、string类
string实际上是模板具体化basic_string的一个typedef,省略了与内存管理相关的参数。
string类将string::npos定义为字符串的最大长度。
string库提供了很多其他的工具,包括完成下述功能的函数:
删除字符串的部分或全部内容;
用一个字符串的部分或全部内容替换另一个字符串的部分或全部内容;
将数据插入到字符串中或删除字符串中的数据;
将一个字符串的部分或全部内容与另一个字符串的部分或全部内容进行比较;
从字符串中提取子字符串;
将一个字符串中的内容复制到另一个字符串中;
交换两个字符串的内容,等等。
string ( const char * s ):将string初始化为s指向的C风格字符串。
string ( size_type n, char c ):创建一个包含n个元素的string对象,其中每一个元素都被初始化为字符c。
C++11新增了两个构造函数,总共有9个构造函数。
运算符重载:
+=:将一个字符串附加到另一个字符串的后面。
=:用于将string对象、C风格字符串或char值赋给string对象。
<<:用于显示string对象。
[]:用于访问字符串中的各个字符。
+:将其两个操作数组合成一个string对象,第二个操作数可以是string对象、C-风格字符串或char值。
string类的输入:
使用getline函数来获取string类的一行字符串,如getline(cin, str)。
二、智能指针模板类
智能指针是行为类似于指针的类对象,但这种对象还有其他功能。
auto_ptr、unique_ptr和shared_ptr都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内顿。因此如果将new返回的地址赋给这些对象,将吴晓旭记住稍后释放这些内存:在智能指针过期时,这些内存将被自动释放。
如果两个指针指向同一个对象时。如果程序试图通过两个指针删除对象两次时这是不能接受的。
要避免这种问题,下面是几种方法:
定义赋值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本。
建立所有权概念,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象。然后,让赋值操作转让所有权。这就是用于auto_ptr和unique_ptr的策略,但unique_ptr的策略更严格。
创建智能更高的指针,跟踪引用特定对象的只能指针数。这称为引用计数。例如,赋值时,计数将+1,而指针过期时,计数将-1.仅当最后一个指针过期时,才调用delete。这是shared_ptr采用的策略。
警告:
使用new分配内存时,才能使用auto_ptr和shared_ptr,
使用new[]分配内存时,不能使用它们。
不使用new分配内存时,不能使用auto_ptr或shared_ptr;
不使用new或new []分配内存时,不能使用unique_ptr。
(怎么说,不会有人连这个都分不清吧?)
选择智能指针
如果程序要使用多个指向同一个对象的指针,应选择shared_ptr这样的情况包括:有一个指针数组,并使用一些辅助指针来标识特定的元素,如最大的元素和最小的元素;两个对象包含都指向第三个对象的指针:STL容器包含指针。很多STL算法都支持复制和赋值操作,这些操作可以用于shared_ptr,但不能用于unique_ptr和auto_ptr。如果编译器没有提供shared_ptr,可使用Boost库提供的shared_ptr。
如果程序不需要多个指向同一个对象的指针,则可以使用unique_ptr,如果函数使用new分配内存,并返回指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。这样所有权将转让给接受返回值的unique_ptr,而该智能指针将负责调用delete。可将unique_ptr储存到STL容器中,只要不调用将一个unique_ptr复制或赋给另一个的方法或算法(如sort)。
标准模板库
STL提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以储存若干值。STL容器是同质的,即储存的值的类型相同;算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的厨房;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。STL使得能够使构造各种容器(包括数组、队列和链表)和执行各种操作(包括搜索,排序和随即排列)。
什么是迭代器?
迭代器是STL中的一个核心概念,它提供了一种访问容器中元素的方法,而不必关心容器的具体实现。迭代器可以看作是一种广义的指针,可以遍历容器中的元素,进行读写操作。
它是一个广义指针。事实上,它可以是指针,也可以是一个可以对其执行类似指针的操作——如接触引用(如operator*()和递增(如operator++()))——的对象。
泛型编程
泛型编程旨在编写对立与数据类型的代码。在C++中,完成通用程序的工具是模板。当然,模板使得能够按泛型定义函数或类,而STL通过通用算法更近了一步。模板让这一切成为可能,但必须对元素进行仔细的设计。
理解迭代器是理解STL 的关键所在。模板使得算法独立于储存的数据类型,而迭代器使算法独立于使用的容器类型。
五、函数对象
STL中的函数对象(也称为仿函数)是一种可调用的对象,它们重载了operator()
,使得它们可以像函数一样被调用。函数对象通常用于作为STL算法的参数,以定义算法的行为。例如,std::less<T>
是一个内置的函数对象,它用于比较两个元素的大小。
很多STL算法都使用函数对象——也叫函数符。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象(即定义了函数operator()()的类。)。
六、算法
STL包含很多处理容器的非成员函数。STL算法库提供了一系列对容器元素进行操作的函数,这些函数不依赖于特定的容器类型,因此具有高度的通用性。
STL将算法库分为4组:
非修改式序列操作;
修改式序列操作;
排序和相关操作;
通用数字运算;
查找算法:
如find
、find_if
、binary_search
等,用于在容器中查找元素。
排序算法:
如sort
、stable_sort
、nth_element
等,用于对容器元素进行排序。
复制算法:
如copy
、copy_if
、copy_n
等,用于将容器中的元素复制到另一个容器或输出流中。
数值算法:
如accumulate
、inner_product
、partial_sum
等,用于对容器中的元素进行数值计算。
七、其他库
C++还提供了其他一些类库,例如头文件complex为复数提供了类模板complex,包含用于float、long、和long double的具体化。这个类提供了标准的复数运算及能够处理复数的标准函数。