1.string类
string类是由头文件string支持的(注意,头文件string.h和cstring支持对C-风格字符串进行操纵的C库字符串函数,但不支持string类)。
1)构造函数
一些符号说明:ctor是传统C++中构造函数的缩写。string实际上是模板规范basic_string<char>的一个typedef,同时省略了与内存管理相关的参数。size_type是一个依赖于实现的整型,是在头文件string中定义的。string类将string::npos定义为字符串的最大长度,通常为无符号int的最大值。缩写NBTS(null-byte-terminated string)表示以空字符结束的字符串---传统的C字符串。
string一共有6个构造函数,列表如下:
下面的程序使用了这6个ctor,并使用了重载的+=,=,<<,[ ]操作符:
2)string类输入
string版本的getline()函数从输入中读取字符,并将其存储到目标string中,直到发生下列3种情况之一:
**到达文件尾。这时,输入流的eofbit将被设置,fail()和eof()都将返回true。
**遇到分界字符(默认为/n),这时,将把分界字符从输入流中删除,但不存储它。
**读取的字符数达到最大允许值(string::npos和可供分配的内存字节数中较小的一个),这时,将设置输入流的failbit,方法fail()将返回true。
下面程序是一个从文件中读取字符串的例子。它假设文件中包含用冒号字符分隔的字符串,并使用指定分界符的getline()方法。然后,显式字符串并给它们编号。
3)使用字符串
可以比较字符串,string对象对全部6个关系操作符都做了重载。而对于每个关系操作符,都以3种方式被重载:string对象与另一个string对象,string对象与C-风格字符串,C-风格字符串与string对象。
可以确定字符串的长度,size()和length()成员函数都返回字符串中的字符数。
关于在字符串里的搜索:
2.auto_ptr类
auto_ptr是一个模板类,用于管理动态内存分配的方法。普通动态内存分配时,由于会常常忘记delete,导致内存泄露。即使没有忘记,如果出现异常,也可能导致delete不了。如果指针是类对象,那么在对象过期时,让它的析构函数删除被指向的内存,这正是auto_ptr背后的思想。
auto_ptr模板定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象。当auto_ptr对象过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给auto_ptr对象时,无须记住稍后释放这些内存。在auto_ptr对象过期时,这些内存将自动被释放。头文件memory包括auto_ptr模板,模板总包括下面代码:
throw()意味着构造函数不引发异常。因此,请求X类型的auto_ptr将获得一个指向X类型的auto_ptr:
new double 是new返回的指针,指向新分配的内存块。它是auto_ptr<double>构造函数的参数,即它是对应于原型中形参p的实参。new string也是同样的道理。下面是两种不用auto_ptr和用auto_ptr来实现动态内存分配的例子:
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/8.jpg
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/9.jpg
3.STL(以vector为例)
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/11.jpg
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/12.jpg
下面是一个要求不高的应用程序,使用了vector类,一个是int规范,一个是string规范。以此让大家熟悉vector类:
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/13.jpg
end():
超尾(超过结尾,past-the-end)是一种迭代器,指向容器最后一个元素后面的那个元素。这与C-风格字符串最后一个字符后面的空字符相似,只是空字符是一个值,而超尾是一个指向元素的指针(迭代器)。end()成员函数标识超过结尾的位置。下面的代码可用来显示容器的内容: for(pd=scores.begin();pd!=scores.end();pd++) cout<<*pd<<endl;
所有容器都有刚才的方法,vector也有一些只有某些STL容器才有的方法。
push_back():
将元素添加到矢量末尾。如下,无须了解元素的数目,只要能够取得足够的内存,程序就可以根据需要添加scores的长度:
erase():
删除矢量中给定区间的元素。接受两个迭代器参数,第一个指向区间的起始处,第二个位于区间终止处的后一个位置。scores.erase(scores.begin(),scores.begin()+2); 将删除begin()和begin()+1指向的元素。因为vector提供了随机访问功能,因此vector类迭代器定义了诸如begin()+2等操作。(p1,p2)表示从p1到p2(不包括p2)的区间,因此[begin(),end()]将包括集合的所有内容,而区间[p1,p1]为空。
insert():
功能与erase()相反。第一个参数指定了新元素的插入位子,后面两个参数定义了被插入区间,该区间通常是另一个容器对象的一部分。例如:
for_each():
用于许多容器类。前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,是一个函数对象)。该函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。可以用for_each()函数来代替for循环。
random_shuffle():
该函数要求容器允许随机访问。它接受两个指定区间的迭代器参数,并随机排列该区间中的元素。如下面语句将随机排列books矢量中所有元素: random_shuffle(books.begin(),books.end());
sort():
该函数也要求容器允许随机访问。该函数有两个版本,第一个版本接受2个定义区间的迭代器参数,使用为存储在容器中的类型元素定义的<操作符,对区间中的元素进行操作。如 vector<int> coolstuff; sort(coolstudd.begin(),coolstuff.end());//对coolstuff里面的内容进行排序,排序时用内置的<操作符进行比较。如果容器元素是用户定义的对象,则必须定义能够处理该类型对象的operator<()函数。
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/14.jpg
https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091028/15.jpg
下面演示了这些STL函数的用法: