深度探索C++标准库中的string

1.     所有搜寻函数的返回类型都是string::size_type,这是string class定义的一个无正负符号整数类型。

2.     string对象的字符串末尾没有’/0’

3.     如果未搜寻到匹配位置,将返回string::npos,检验搜寻函数返回值必须使用string::size_type而不是intunsigned。否则与string::npos的比较动作将无法有效运行。

4.     字符长度可以为任意值。如果其值大于实际剩余的字符数,则这些剩余字符都会被找到。如果使用string::npos,相当于指明“剩余所有的字符“。(p475

5.     使用length()size()计算字符串的字符个数时返回结果完全一样。但是他们是依照不同的设计原则执行了相同的动作,length()传回了字符串的长度,就好像C-stringstrlen()所得结果一样,size()则是根据STL习惯而设的,用以表明元素数量。

6.     在比较时,int型和string::size_type不能直接比较,必须先把string::size_type转型为int,如果不转型,当带负号的i与不带正负号的类型相比较时,i会被自动转型为无正负号,如果此时for循环为:

for(int i=endIdx-1;i>=begIdx;--i) 如果i为负值,而begIdx0,那么i>=begIdx永远为true(C++标准程序库 p479)

7.     只有在单参数版本才把char*字符’/0’当做字符串结尾特殊符号来处理,其他所有情况下’/0’都不被视为特殊字符。(C++标准程序库p482

8.     不能以单一字符来初始化某个字符串:

std::string s(‘x’);  //error

但是你可以这么做:

std::string s(1,‘x’); //OK

这表示编译器提供了一个从const char*string的自动类型转换,但不存在从charstring的自动类型转换。

9.     C++standard将字符串字面常数由char*改为const char*。为了提供向下兼容性,C++standard规定const char*可隐式转换为char*const char*可以自动转换为string,但是string不可自动转换为C-string

10.  注意data() c_str() copy()三者的区别(C++标准程序库p484)

注意data(),c_str()返回的字符数组由该字符串拥有,也就是说调用者千万不可修改它或释放内存(这两个函数返回值都是const char*)。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。(为什么?)

注意data()c_str()的区别:

const  charT*  c_str () const
{ if (length () == 0) return ""; terminate (); return data (); }

c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以/0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。

这里还要注意一点:c_str()data()的返回值有效期限在下一次调用non-const成员函数即告终止:

std::string s;

foo(s.c_str())  //s.c_str()始终有效,因为这里未使用一个临时变量来装它

const char* p;

p=s.c_str(); 

foo(p);   //OK,这里p还是可用的

s+=”ext”;

foo(p);  //此时p已经失效。因为是第二次调用non-const成员函数

再看下面一个例子:

string str("hello world");

const char* p = str.c_str();

str += "ext";

cout<<p<<endl;  //这里会输出”hello worldext”,是否因为引用的原因?

11.  string构造函数中,只有在单参数版本,才将char*字符’/0’当做字符串结尾特殊符号来处理:

string::string(const char* cstr)  //产生一个字符串,以C-string cstr为初值,初值为cstr内以‘/0’为结束符号(但不包括’/0’)的所有字符

其他所有情况下’/0’都不被视为特殊字符:

std::string s1(5,’/0’);   //s1初始化为’/0’ ’/0’ ’/0’ ’/0’ ’/0’

12.  对于operator[]const版本,最后一个字符的后面位置也是有效的。此时的实际字符数是有效索引,在此情况下operator[]返回值是由char型别之default构造函数所产生的字符,因此对于型别为string的对象,返回值是’/0’

其他情况,实际字符数都是个无效索引,如果使用该索引会引发异常或未定义行为。

 

 

你可能感兴趣的:(深度探索C++标准库中的string)