c++ string
string隐藏了他所包含的字符序列的物理表示。
也包含了关于其数据容量及存储地址的内务处理信息。
c++标准没有定义string内存布局的确切实现。只是规定无论是否采取引用计数,其语言必须保持一致。
c语言中每个char数组都占据各自独立的存储区域,但是在c++中独立的几个string对象可以占据也可以不占据各自特定的物理存储区,但是如果采用引用计数避免保存同一个对象的副本,那么各个对象必须看起来像独立拥有各自的存储区一样。
- 字符串操作
replace改写字符
有很多重载的版本, 最简单的用了三个参数,第一个用于指示字符串的什么位置开始改写, 第二个用于指示从源字符串中删除多少个字符,另外一个是用于替换的字符串(长度可以和被删除的字符串的长度不符)
#include#include using namespace std;int main(){ string s1("this is my home, this is my home"); string s2("this"); int i; i = s1.find(s2); while(i!=string::npos) { s1.replace(i, s2.length(), "those"); i = s1.find(s2); } cout< <
find查找字符串
可以将开始查找的位置作为第二个参数
如果查找不到, 则会返回string::npos,静态成员, 值为size_t所能表示的最大值。
- 字符串比较
为了高效的运行,对于字符串对象、引用文字和指向c语言风格的字符串指针等的直接比较,string类不创建临时string对象,而是采用重载运算符进行。
#includeusing namespace std;int main(){ string s1("this"); string s2("this"); if(s1 == s2.c_str()) cout<<"yes"<
c_str()返回一个const char*他指向一个c风格的具有空结束符的字符串,内容和string对象中的内容等价。
将其返回值作为非const参数应用于任何一个函数都是错误的。
compare成员函数可以提供更加精确的比较:
两个完整的字符串
一个字符串的部分和另一个字符串的全部
两个字符串的子集
取字符串中的个别字符
[]操作符用下标语法,如果访问越界,不会抛出异常
at()会抛出一个out_of_range异常
- string的本质
string不是一个类,basic_string<>模板是一种更通用的工具,而string类型只是其更专门化的版本。
声明:
typedef basic_string<char> string;
basic_string模板
template<class charT, class traits = char_traits<charT>,
class allocator = allocator<charT>> class basic_string;