字符串在很多编程语言中已经成为基本数据类型,C语言中我们使用char*来手动维护字符串的内存, 在C++中,可以使用std::string来方便地创建和操作字符串。

string是一个模板类,它有basic_string<T>定义:

typedef basic_string<char> string;

C++的string可以通过成员方法c_str()转换为C语言的char*

参考文档:cplusplus.com/string

初始化与赋值

string有两个常用的构造函数:

// 用一个C字符串构造
string str("hello");
// 等价于
string str = "hello";

也可以用N个同样的字符来构造字符串:string str2(8, 'x')

在C0x标准中,std::to_string可以将很多类型转换为一个string,可以代替itoa,例如:

string str = to_string(123);

string构造函数不接受charint类型。

字符串可以直接互相赋值,内存会自动拷贝和销毁,我们大可不必管它。对于单个字符赋值可以使用下标运算符:

for(int i=0;i<str.length(); i++){
    str[i] = 'a';
}

与多数class类似,string也提供了swapstr1.swap(s2)将会交换二者的值。

运算符支持

有通用运算符支持的数据类型往往更容易理解和操作,其中最讨人喜欢的莫过于+运算符:

str += str2;
str = str + "hello";

当然,你也可以直接调用append方法:str.append(str2)

除了+string还支持一系列的比较运算符:<, ==, >, <=, >=, !=

当然,你仍然可以直接调用compare方法:str1.compare(str2)str1小则会返回-1

长度

  • 字符串为空
    • empty():返回是否为空。
    • clear():清空字符串。
  • 字符串长度
    • length():等效于size(),返回字符串长度。
    • resize(10, 'x'):改变长度,如果超过了原有长度,后面补x,第二个参数默认值为null。
  • 字符串内存
    • capacity():无需再次申请内存可存放的字符数。
    • reserve(10):申请10字符的内存,通常在大量的insert前先reserve一下,避免多次申请内存。

查找

  • str.find("ll"):字符串llstr中第一次出现的下标,未找到为string::npos
  • str.rfind("ll"):同上,从右向左查找。
  • str.find("ll", 3):从下标3开始查找。

修改

  • erase(5):去掉下标5开始的所有字符。
  • replace(2, 3, "ll"):下标2开始的3个字符换成"ll"
  • insert(2, "ll"):下标2处插入"ll"

流处理

在C++中,标准输入输出、文件、字符串都可以作为一个流,来接受输入或者输出。 在C++中字符串流也是格式化输出的一种常用手段。

string input("test 123");
istringstream sinput(input);

string str;
int i;
sinput >> str >> i;

ostringstream soutput;
soutput << str << i;
cout<< soutput.str();
// test123

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/06/30/std-string.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。