第十六章 String类和标准模板库(1. string类、智能指针)

你究竟是玩家还是角色!!!

1、String类

string实际上是模板具体化basic_base<char>的一个typedef。

string类将string::npos定义为字符串的最大长度,npos变量是string类的静态成员。

string类的构造函数如下:

构造函数参数为string和char*类型时:

当构造函数有三个参数时,都表示从第二个参数的索引开始,输出第三个参数个字符。当构造函数只有两个参数时,第一个参数为string类型时,输出从第二个参数的索引到之后的所有字符;第一个参数为char*类型时,输出从第一个字符到第二个参数的索引的字符。

 getline()

1. 作为istream类的成员函数,用cin.getline()调用,有两个版本:

cin.getline(char* str, int n)//第二个参数为写入str的字符个数

cin.getline(char* str, int n, char c)//第三个参数为分隔符

2. 作为非成员函数使用(针对string类型的字符串)

getline(istream cin, string str)

getline(istream cin, string str, char c)

string类的成员函数

1. 返回字符串中的字符数

size(); length();

2. 在字符串中搜索给定的子字符串或字符

find() //返回查找字符或字符串首次出现的位置(索引值),找不到的话返回npos(-1);

1     string str3 = "abcdefghijklmnopqrstuvwxyz";
2     char ss[] = "ghi000";
3     int w = str3.find(ss, 3);//返回字符串(ss的前三个字符组成的字符串)首次出现时的索引,找不到的话返回npos
4     cout << w << endl;

rfind() //返回字符或字符串最后一次出现的位置;

find_first_of() //返回字符串/字符参数中任一字符在string调用对象中首次出现的位置;

string str = "abcdefghijklmn";
char str0[] = "zlnget";
str.find_first_of(str0);

find_last_of() //与find_first_of()功能相似,返回最后一次出现的位置;

find_first_not_of() //返回string调用对象中第一个不在字符串参数中的字符的索引;

find_last_not_of() //。

3. 返回字串内存的大小

capacity() //返回程序分配给字串内存块的大小(字节数);

reserve() //参数为请求内存块的最小长度。

4. c_str() //返回一个指向C风格字符串的指针。

智能指针模板类

智能指针是行为类似于指针的类对象。

无论函数以任何一种形式终止,当指针过期时,都将释放智能指针指向的内存。

智能指针模板类在头文件memory中声明,位于名称空间std中。

std::auto_ptr<double> ps (new Report("abcdefg")); //Report为类名。

三种智能指针的注意事项

当多于一个指针指向同一对象时,那么此对象将会被释放两次,这显然是不合理的。要避免这个问题,有三种解决方案:

1. 定义赋值运算符,执行深度复制。使其它指针指向此对象的副本。

2. 建立所有权概念,一个对象,只能有一个指针拥有它。指针间的赋值操作将转移所有权。(这是auto_ptr和unique_ptr的策略)

3. 创建更智能的指针,跟踪引用对象的智能指针数。仅当最后一个指针过期时,才调用delete。(这是share_ptr的策略)

 auto_ptr和unique_ptr的区别

auto_ptr已被弃用,因为当一个智能指针赋值给另一个智能指针时,指针指向的对象的所有权将会转移,将会产生悬挂指针(不再指向有效的数据)。

为避免悬挂指针问题,unique_ptr不允许将一个智能指针(将存在一段时间的指针变量)赋值给另一个智能指针。(unique_ptr比auto_ptr更安全)

但unique_ptr类型的智能指针允许将一个临时指针对象赋值给另一个智能指针变量;

也允许将一个(存在一段时间的)智能指针对象赋值给另一个智能指针(使用标准库函数std::move());

 1 #include<memory>
 2 using namespace std;
 3  //智能指针指向string类对象
 4 unique_ptr<string> ps ( new string("IIT") );
 5 unique_ptr<string> pr;
 6 pr = ps; //不允许将存在一段时间的智能指针对象赋值给另一个智能指针
 7 pr = move(ps); //允许,只要不对ps进行解除引用等普通指针操作。可以对ps重新赋值
 8 ps = string("IIT2"); //对ps重新赋值
 9 /*如果智能指针对象是临时的,编译器将允许把临时智能指针对象赋值给另一个智能指针*/
10 unique_ptr<string> demo(const char* s){
11     unique_ptr<string> temp ( new string(s) );
12     return temp;  
13 }
14 unique_ptr<string> pt;
15 pt = demo("IIT4");

unipue_ptr可用于数组(而auto_ptr和shared_ptr则不允许)。

unique_ptr< double [] > ps( new double(5) );
原文地址:https://www.cnblogs.com/sungnox/p/7691219.html