【c++编程思想】字符串

c++ string


string隐藏了他所包含的字符序列的物理表示。
也包含了关于其数据容量及存储地址的内务处理信息。
 
c++标准没有定义string内存布局的确切实现。只是规定无论是否采取引用计数,其语言必须保持一致。
c语言中每个char数组都占据各自独立的存储区域,但是在c++中独立的几个string对象可以占据也可以不占据各自特定的物理存储区,但是如果采用引用计数避免保存同一个对象的副本,那么各个对象必须看起来像独立拥有各自的存储区一样。
 
 
  • 字符串操作
replace改写字符
有很多重载的版本, 最简单的用了三个参数,第一个用于指示字符串的什么位置开始改写, 第二个用于指示从源字符串中删除多少个字符,另外一个是用于替换的字符串(长度可以和被删除的字符串的长度不符)
 
#include<iostream>
#include<string>
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<<s1<<endl;
}

 

 
 
find查找字符串
可以将开始查找的位置作为第二个参数
如果查找不到, 则会返回string::npos,静态成员, 值为size_t所能表示的最大值。
 
 
 
  • 字符串比较
为了高效的运行,对于字符串对象、引用文字和指向c语言风格的字符串指针等的直接比较,string类不创建临时string对象,而是采用重载运算符进行。
#include<iostream>
using namespace std;
int main()
{
    string s1("this");
    string s2("this");
    if(s1 == s2.c_str())
        cout<<"yes"<<endl;
    const char *str = "what";
    str = s2.c_str();
    cout<<str<<endl;
}

 

 
 
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;
 
 
posted @ 2012-09-12 12:58  w0w0  阅读(236)  评论(0编辑  收藏  举报