date: 2020/01/10

http://www.cplusplus.com/reference/string/string/

http://c.biancheng.net/view/400.html

 #include <string> 

事实上vector的用法在string上几乎也都能适用

构造

// 默认:string();
string str();   // ""

// 从c-string拷贝:string (const char* s);
// 从string拷贝:string (const string& str);
string str1("123");   // "123"
string str2(str1);    // "123"

// 从c-string获取子串:string (const char* s, size_t n);
// 从string获取子串:string (const string& str, size_t pos, size_t len = npos);
string str1("123456789", 1, 7);   // "2345678"
string str2(str1, 1, 5);   // "34567"

// 用字符填充:string (size_t n, char c);
string str(5, 'h');   // "hhhhh"

赋值

运算符=

支持string、char[]、char

// string:string& operator= (const string& str);
string str1("123");
string str2 = str1;   // "123"

// c-string:tring& operator= (const char* s);
string str = "123";   // "123"

// c-char:string& operator= (char c);
string str = 'c';    // "c"

方法assign

支持构造函数的所有方法

string str1, str2;   // "", ""

str1.assign("123");   // "123"
str2.assign(str1);    // "123"

str1.assign("123456789", 1, 7);   // "2345678"
str2.assign(str1, 1, 5);          // "34567"

str1.assign(5, 'h');    // "hhhhh"

获取长度

对string来说,size()和length()等价


size_t size() const;
size_t length() const;

拼接

运算符+和+=


string s1("123"), s2("abc");
string s3 = s1 + s2;  // "123abc"
s3 += "hhh";   // "123abchhh"

方法append

类似运算符+=,但支持构造和asign的一系列操作

string s1("123"), s2("abc");
s1.append(s2);             // s1 = "123abc"
s1.append(s2, 1, 2);       // s1 = "123abcbc"
s1.append(3, 'K');         // s1 = "123abcbcKKK"
s1.append("ABCDE", 2, 3);  // s1 = "123abcbcKKKCDE"

比较

比较运算符


string s1("hello"), s2("hello, world");
if(s1 == s2){}
if(s1 != s2){}
// <, <=, >, >=

方法compare

string s1("hello"), s2("hello, world");
int n;

// 普通的比较:
// int compare (const string& str) const;
// int compare (const char* s) const;
n = s1.compare(s2);  // 小于0,s1比s2小;等于0,s1与s2相等;大于0,s1比s2大
n = s1.compare("Hello");

// 子串比较:
// int compare (size_t pos, size_t len, const string& str) const;
// int compare (size_t pos, size_t len, const char* s) const;
// int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
// int compare (size_t pos, size_t len, const char* s, size_t n) const;
n = s1.compare(1, 2, s2, 0, 3);  //比较s1的子串和s2的子串
n = s1.compare(0, 2, s2);  // 比较s1的子串和 s2
n = s1.compare(1, 2, "Hello");  //比较 s1 的子串和"Hello”
n = s1.compare(1, 2, "Hello", 2);  //比较 s1 的子串和"Hello”的子串
n = s1.compare(1, 2, "Hello", 1, 2);  // (注意这里char[]已经自动转换成string)比较 s1 的子串和 "Hello" 的子串

求子串

// string substr (size_t pos = 0, size_t len = npos) const;
string s1 = "this is ok";
string s2 = s1.substr(2, 4);  // s2 = "is i"
s2 = s1.substr(2);  // s2 = "is is ok",省略len或超出范围,则截取pos开始余下的所有内容

交换内容

方法swap,用法与vector::swap()相同

s1.swap(s2);

查找

以从前往后查找字符或字符串的方法find为例

size_t find(const string& str, size_t pos = 0);
size_t find(const char* s, size_t pos = 0);
size_t find(const char* s, size_t pos, size_t n);
size_t find(char c, size_t pos = 0);

类似的还有:

以上所有查找方法的使用形式类似,接受的参数相同,均返回满足条件的字符的位置或字符串的起始位置,如果均不满足则返回常量 string::npos ,也即 -1

增删改

替换replace:

// 用string替换(被替换串定位方式既可以是索引也可以是迭代器,替换串也可以用索引选取子串)
string& replace (size_t pos,  size_t len,  const string& str);
string& replace (iterator i1, iterator i2, const string& str);
string& replace (size_t pos,  size_t len,  const string& str, size_t subpos, size_t sublen);
// 用c-string替换(被替换串定位方式既可以是索引也可以是迭代器,替换串可以指定长度)
string& replace (size_t pos,  size_t len,  const char* s);
string& replace (iterator i1, iterator i2, const char* s);
string& replace (size_t pos,  size_t len,  const char* s, size_t n);
string& replace (iterator i1, iterator i2, const char* s, size_t n);
// 用重复的字符替换(被替换串定位方式既可以是索引也可以是迭代器)
string& replace (size_t pos,  size_t len,  size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
// 用迭代器的内容替换
string& replace (iterator i1, iterator i2, iterator first, iterator last);


删除erase(用法与vector类似,但多一种索引指定的方式):

string& erase (size_t pos = 0, size_t len = npos);   // 这是vector所没有的用法
iterator erase (iterator p);   // 同vector
iterator erase (iterator first, iterator last);    // 同vector


插入insert(拥有vector::insert的所有用法,也多出很多独有的用法):

// 与vector相同的三种用法
iterator insert (iterator p, char c);
void insert (iterator p, size_t n, char c);
void insert (iterator p, iterator first, iterator last);
// 用string插入(可以用索引指定子串)
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
// 用c-string插入(可以指定长度)
string& insert (size_t pos, const char* s);
string& insert (size_t pos, const char* s, size_t n);
// 用重复字符填充
string& insert (size_t pos, size_t n, char c);