第16章 string类和标准模板库

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个构造函数,列表如下:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091027/1633922777406908746.jpg

      下面的程序使用了这6个ctor,并使用了重载的+=,=,<<,[ ]操作符:

2)string类输入

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091027/2633922796369933314.jpg

     string版本的getline()函数从输入中读取字符,并将其存储到目标string中,直到发生下列3种情况之一:

**到达文件尾。这时,输入流的eofbit将被设置,fail()和eof()都将返回true。

**遇到分界字符(默认为/n),这时,将把分界字符从输入流中删除,但不存储它。

**读取的字符数达到最大允许值(string::npos和可供分配的内存字节数中较小的一个),这时,将设置输入流的failbit,方法fail()将返回true。

     下面程序是一个从文件中读取字符串的例子。它假设文件中包含用冒号字符分隔的字符串,并使用指定分界符的getline()方法。然后,显式字符串并给它们编号。

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091027/3633922802772038866.jpg

3)使用字符串

     可以比较字符串,string对象对全部6个关系操作符都做了重载。而对于每个关系操作符,都以3种方式被重载:string对象与另一个string对象,string对象与C-风格字符串,C-风格字符串与string对象。

     可以确定字符串的长度,size()和length()成员函数都返回字符串中的字符数。

     关于在字符串里的搜索:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091027/4633922810405223042.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091027/5633922810406160536.jpg

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函数的用法:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值