C语言中的字符串称为C风格字符串,是一个以'0'结尾的字符数组,string.h库只提供了有限、不甚安全的字符串操作函数。char str[]只能定义编译期确定大小的字符串,而保存在堆内存的动态字符数组却需要考虑释放内存的问题,且想要实现自变长的弹性大小也存在诸多纷繁的操作细节。C++ STL中的string类一揽子解决了诸如此类的问题。除此以外,STL算法通过traits和iterator中间层来操作各类容器,也包括string。

C++中常用的string类其实是一个typedef:

typedef basic_string string;

basic_string是STL中的类模板,用char实例化这个类模板,取别名为string。

之所以在String中定义basic_string模板类,而不是直接的string模板类,是因为其考虑处理的容器元素,不单只是一个字节的ASCII字符,还有宽字符wchar_t以及char16_t、char32_t或unsigned char等。

1 封装字符串的由来

1.1 不封装的缺陷

char *cp = "abc";    // 其实是const,字面量"abc"并不存储在栈区,而是常量区//cp[2] = 'D';           // errorchar arr[4] = "abc"; // 固定大小int size = 4;char *dp = new char[size];dp[0]='a';dp[1]='b';dp[2]='c';dp[3]='0';cout<

1.2 封装为类:可变长、并自动释放堆内存

封装一个字符指针,由这个指针指向一块new出来的堆内存,并按传入的字符串字面量复制入这块堆内存。

// string.h#ifndef __MYSTRING__#define __MYSTRING__class String{public:                                    String(const char* cstr=0);                        String(const String& str);                       String& operator=(const String& str);            ~String();                                       char* get_c_str() const { return m_data; }private:   char* m_data;};#include inlineString::String(const char* cstr){   if (cstr) {      m_data = new char[strlen(cstr)+1];      strcpy(m_data, cstr);   }   else {         m_data = new char[1];      *m_data = '0';   }}inlineString::~String(){   delete[] m_data;}inlineString& String::operator=(const String& str){   if (this == &str)      return *this;   delete[] m_data;   m_data = new char[ strlen(str.m_data) + 1 ];   strcpy(m_data, str.m_data);   return *this;}inlineString::String(const String& str){   m_data = new char[ strlen(str.m_data) + 1 ];   strcpy(m_data, str.m_data);}// String_test.cpp#include using namespace std;ostream& operator<using namespace std;int main(){  String s1("hello");   String s2("world");      String s3(s2);  cout << s3 << endl;    s3 = s1;  cout << s3 << endl;       cout << s2 << endl;    cout << s1 << endl;       String *p = new String[3];  p[0] = "We";  p[1] = "are";  p[2] = "one";  char* str = p[2].get_c_str();  cout << str << endl;  delete[] p;  cin.get();}/*worldhelloworldhelloone*/

进一步,可以封装为类模板,可以访问不同的字符类型。

2 STL

STL string模板类在上述基础上实现了类型泛化,并封装了很多的成员函数,且有STL算法库中的函数模板支持。

2.1 两个类模板

basic_string Generic string class (class template )

char_traits Character traits (class template )

2.2 模板类4个

string String class (class )

u16string String of 16-bit characters (class )

u32string String of 32-bit characters (class )

wstring Wide string (class )

2.3 转换函数或函数模板

stoi Convert string to integer (function template )

stol Convert string to long int (function template )

stoul Convert string to unsigned integer (function template )

stoll Convert string to long long (function template )

stoull Convert string to unsigned long long (function template )

stof Convert string to float (function template )

stod Convert string to double (function template )

stold Convert string to long double (function template )

to_string Convert numerical value to string (function )

to_wstring Convert numerical value to wide string (function )

3 basic_string模板类

basic_string模板类声明:

template < class charT,           class traits = char_traits,    // basic_string::traits_type           class Alloc = allocator        // basic_string::allocator_type           > class basic_string; 

basci_string封装一根指向字符类型的指针,也就是管理一个以'0'结尾的字符动态数组,有了诸多操作的封装,中间层有迭代器iterator和萃取器traits,traits用于迭代器、型别等的提取,iterator用于封装一个basci_string容器类对象指针,一些独立于容器的算法可以通过迭代器来操作容器元素。

char_traits用于类模板容器元素的型别选择,也是一个模板类:

template  struct char_traits;template <> struct char_traits;template <> struct char_traits;template <> struct char_traits;template <> struct char_traits;

该特性类别规定了“复制字符”或“比较字符“的做法,如果不指定该特性类别,会根据现有的字符型别采用默认的特性类别。

其成员函数包括:

eqCompare characters for equality ( public static member function )ltCompare characters for inequality ( public static member function )lengthGet length of null-terminated string ( public static member function )assignAssign character ( public static member function )compareCompare sequences of characters ( public static member function )findFind first occurrence of character ( public static member function )moveMove character sequence ( public static member function )copyCopy character sequence ( public static member function )eofEnd-of-File character ( public static member function )not_eofNot End-of-File character ( public static member function )to_char_typeTo char type ( public static member function )to_int_typeTo int type ( public static member function )eq_int_typeCompare int_type values ( public static member function )

实例:

// char_traits::compare#include    // std::cout#include      // std::basic_string, std::char_traits#include      // std::tolower#include     // std::size_t// case-insensitive traits:struct custom_traits: std::char_traits {    static bool eq (char c, char d)     {         return std::tolower(c)==std::tolower(d);     }    static bool lt (char c, char d)     {         return std::tolower(c)<:tolower static int compare char p const q std::size_t n while if return lt main std::basic_string> foo,bar;    foo = "Test";    bar = "test";    if (foo==bar)         std::cout << "foo and bar are equal";    return 0;}// output: // char_traits::compare

allocator有默认值,定义字符串类别所采用的内存模式,将容器与物理存储细节分隔,提供了一套分配与释放堆内存的标准方式,其型别为charT,可以是char、wchar_t、char16_t、char32_t。

类模板实例化的模板类:

stringString class (class )wstringWide string (class )u16string String of 16-bit characters (class )u32string String of 32-bit characters (class )

所用字符串类型均使用相同接口,用法和问题都一样,以下是部分成员函数:

(constructor)Construct basic_string object (public member function )(destructor)String destructor (public member function )operator=String assignment (public member function )sizeReturn size (public member function )lengthReturn length of string (public member function )operator[]Get character of string (public member function )atGet character of string (public member function )operator+=Append to string (public member function )appendAppend to string (public member function )push_backAppend character to string (public member function )insertInsert into string (public member function )replaceReplace portion of string (public member function )c_strGet C-string equivalentfindFind first occurrence in string (public member function )rfindFind last occurrence in string (public member function )substrGenerate substring (public member function )compareCompare strings (public member function )operator+Concatenate strings (function template )operator>>Extract string from stream (function template )getlineGet line from stream into string (function template )

4 string类

string类是使用char(即字节)作为其字符类型的basic_string类模板的一个实例化,其有默认char_traits和分配器类型。

其迭代器为a random access iterator to char。

string提供的接口类似于标准字节容器的接口,但添加了专门设计用于使用单字节字符字符串操作的功能。

string类独立于使用的编码处理字节,如果用于处理多字节或可变长度字符(如UTF-8)的序列,则该类的所有成员(如长度或大小)及其迭代器仍将按字节(而不是实际的编码字符)操作。string类的型别虽是char,但因为char是一个字节,其有天然的按字节(byte)处理的优势,也是汉字等一些其它编码的字符能被string类处理的原因,处理完后再按其原本的编码解析即可。

wstring类是使用wchar_t(即字节)作为其字符类型的basic_string类模板的一个实例化。

在Windows下,wchar_t占2个字节(byte);在Linux下,wchar_t占4个字节。

u16string、u32string则是确定长度的宽字节类型。

wstring、u16string、u32string类有与string类相同接口的成员函数。

-End-

c++ string类_C++|细说STL string类概貌及底层细节相关推荐

  1. java 虚基类_C++中虚基类与抽象类的简单理解。

    虚基类   是相对于它的派生类而言的,它本身可以是一个普通的类. 只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类.比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有 ...

  2. c语言存储类_C编程语言的存储类

    c语言存储类 A variable's storage class tells us the following, 变量的存储类告诉我们以下内容: Where the variables would ...

  3. c# mysql 连接类_c#中连接数据库的类怎么写呀?

    展开全部 楼一e69da5e6ba9062616964757a686964616f31333238653964给的个只能连接sql,楼二是忽悠,我的可以连接access,sql,oracle,exce ...

  4. C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)

    1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...

  5. string类有可以调换方向的函数吗_C++中的string类的用法小结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  6. 【C++】STL——string的简单介绍、string类的访问和遍历、operator[] 、begin+ end begin 、rbegin + rend begin 、范围for

    文章目录 1.string类 1.1string类对象的访问及遍历操作 (1)operator[] (2)begin+ end begin (3)rbegin + rend begin (4)范围fo ...

  7. java引入string类_Java基础教程——String类

    String类 Java程序中的所有字符串字面值(如 "abc" )都是String的实例 字符串是常量(因为 String 对象是不可变的,所以可以共享) 字符串的本质是字符数组 ...

  8. 【String类、static、Arrays类、Math类】

    一 String类 1.1 String类概述 概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例 ...

  9. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用"="或者使用"new String(...)" String aStr = " ...

最新文章

  1. 026-请问你怎么测试网络协议
  2. C#去掉字符串中的汉字
  3. 多列布局——column-width
  4. asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整...
  5. Cartographer—ROS中的安装
  6. 程序员亲身体验的学历之痛
  7. 流程管理的流程与角色
  8. python退出帮助系统_Python退出脚本并返回Main
  9. swift5的下标Subscripts 花式玩法
  10. input输入身份证验证
  11. SpringBoot+Querydsl 框架,大大简化复杂查询操作
  12. msicuu.exe,msizap.exe
  13. 论文写作——小白如何写好并投稿自己的第一篇英文论文?
  14. 剪辑神器,分享一个可以批量修改大量视频MD5值的工具
  15. 荣耀手机环比倍增,小米有点受伤
  16. Bestcoder13 1003.Find Sequence(hdu 5064) 解题报告
  17. Innovator Admin 一个aras的管理器,又一个package安装方法
  18. signature=f81ed620b6d6e6cb4bbe5a4d79d445b8,Lubricating compositions
  19. PMI-ACP(Agile Certified Practitioner)敏捷管理专业人士资格认证考试知识点汇总
  20. 计算机的语言是美式英语,为什么电脑的语言栏一直有两国语言“CH中文(中国)”和“EH英语(美国)”...

热门文章

  1. SQL Server 2005 高级程序设计 学习笔记(2)
  2. EditPlus构建轻量级编译环境
  3. python生成list的时候 可以用lamda也可以不用_python 可迭代对象,迭代器和生成器,lambda表达式...
  4. Lock的lockInterruptibly()
  5. mapperLocations属性通配符的使用
  6. python判断是否为完全数_Python识别完美数
  7. 判断鼠标是否在元素上_是否清扫保洁、是否雾撒降尘?江城环卫车装上了北斗,动动鼠标就知道了...
  8. mysql添加约束之前不满足_MySQL:添加约束(如果不存在)
  9. [转载] JVM(一):JVM体系结构详解
  10. md5不是对称密码算法_密码学中的消息摘要算法5(MD5)