string和basic_string的关系

来源:互联网 发布:linux中yum命令 编辑:程序博客网 时间:2024/06/10 20:48

string和basic_string的关系

  写这篇博客的原因是在一个项目中看到str.find("abc") != std::string::npos这么一句代码,在印象中,find返回值不是这么复杂,如果没找到返回值是-1,直接和-1做判断就可以str.find("abc") != -1,之后就开始了查看MSDN之路,才发现string不是那么单纯。如果要把标准C++ string转换成C style string可以用成员函数basic_string::c_str()。c style string可以简单的理解为char类型数组以’\0’结尾,例如char *cStr = "cstr";或者char cStr1[] = "cstr";,char cStr1[5] = "cstr";\\由于c style string结尾有'\0'因此如果要明确数组大小的话,需要比字符串中字符个数多1。

摘要

  简单来说basic_string是一个模版类,string是模版形参为char的basci_string模版类的类型定义,即typedef

typedef basic_string<char, char_traits<char>, allocator<char> >    string;

而npos,是初始化为-1表示没有找到:

static const size_type npos = -1;
  • basic_string

      basic_string是类模版,并且是容器类模版,basic_string类模版的对象管理的序列是标准的C++ 字符串,basic_string包括string、wstring、u16string和u32string)。标准C++ 字符串类是一个容器,因此可以像操作其他普通类型一样,对C++ string类进行操作,例如比较,迭代,STL算法等。
      basic_string的声明如下:

    template <clase CharType, class Traits = char_traits<CharType>, class Allocator = allocator<CharType>>

    实际在VS2013中,右键std::string转到定义处,再右键basic_string转到声明,会发现basic_string是在一个xstring文件中,不知道是什么文件,没有文件类型拓展名。xstring文件中basic_string的声明如下:

    template<class _Elem,class _Traits = char_traits<_Elem>,class _Ax = allocator<_Elem> >class basic_string;

    其中:
      CharType:表示存在字符串中的单个字符的数据类型,也就是字符串找那个单个元素的类型。类型定义string表示元素类型为char,类型定义wstring表示元素类型为wchar_t,类型定义u16string表示元素类型为char16_t,类型定义u32string表示元素类型为char32_t。
      Traits:trait也是一个类模版,这一部分应该是和STL封装相关的部门,还没有研究这么深入;默认是char_traits
      Allocator:同样是和STL相关的部分;默认是allocator

  • string
    string其实是形参为char的basic_string类模版的一个别名

    typedef basic_string<char, char_traits<char>, allocator<char> >string;

参考连接:
basic_string参考
https://msdn.microsoft.com/en-us/library/syxtdd4f(v=vs.120).aspx
string参考https://msdn.microsoft.com/en-us/library/y4k49tt9(v=vs.120).aspx


这里只单纯的记下string和basic_string的区别,深究起来里面有很多东西,比如c style string和标准C++ string的区别,已经为什么微软要定义一个basic_string模版类,这里面都很有文章,由于展开比较大,暂不做研究。
https://blog.codingnow.com/2013/09/cstring.html这个博客下面的评论比较有意思

原创粉丝点击