简介
在C语言中,一般使用字符数组char str[]来存放字符串,但是操作麻烦,容易出错。C++在STL中加入了string类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。
注:本文章只列举 string 在 ACM 中的常用操作,如需了解更多有关 string 的内容,请参考 C++官方文档
String 的基本用法
头文件 #include <string>
需要使用 std 命名空间 using namespace std;
注意:如果要读入或者输出整个字符串,一般只能用cin和 cout。如果非要用printf输出string,则需要用c_str()函数将 string转换成字符数组。
cin>>str;
cout<<str<<endl;
printf("%s\n",str.c_str()); //printf输出string
定义 string
定义的方法有很多,在官方文档中例子的基础上修改。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
std::string s0 ("Initial string");
std::string s1 = “123”; //直接赋值
std::string s2 (s0); //复制字符串
std::string s3 (s0, 8, 3); //从下标为8的位置开始取3个字符
std::string s4 ("A character sequence");
std::string s5 ("Another character sequence", 12); //前12个字符
std::string s6a (10, 'x'); //10个相同字符
std::string s6b (10, 42); //42是'*'的ASCII码
std::string s7 (s0.begin(), s0.begin()+7); //使用迭代器复制区间
std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
return 0;
}
Output:
s1: 123
s2: Initial string
s3: str
s4: A character sequence
s5: Another char
s6a: xxxxxxxxxx
s6b: **********
s7: Initial
string 中字符的访问
直接访问:
string str;
cout<<str[0];
迭代器访问:
string str="abcdefg";
for(string::iterator it=str.begin()+2; it!=str.end();it++)
{
printf("%c",*it);//输出cdefg
}
string 运算符
加法运算符:
把两个字符串直接拼接起来。
string str1="abc";
str2="xyz";
str3 = str1 + str2;
str1 += str2;
cout << str1 << endl; // abcxyz
cout << str3 << endl; // abcxyz
关系运算符:
按照字典序比较两个 string 类型的大小。
string str1="aa";
str2="aaa";
str3="abc";
if(str1 < str2) printf("OK1"); // 输出 OK1
if(str1 < str3) printf("OK2"); // 输出 OK2
常用函数
str.length()
和str.size()
两种方法返回字符串长度且返回值相等。str.clear()
清空字符串 string。str.substr(pos,len)
取子字符串,返回从 pos 开始长度为 len 的 string。str.insert(it1,it2,it3)
字符串 it1 位置插入 it2 和 it3 之间的内容。str.erase(it_first,it_last)
删除区间内字符(区间左闭右开)。str.erase(pos,len)
区间删除,删除从 pos 开始的 len 个字符。str.find(str2)
查找字符串,找到返回 str2 在 str 中第一次出现的位置,否则返回 string::npos。str.find(str2,pos)
从 str 的 pos 位开始查找 str2,返回值同 str.find(str2)。str.replace(pos,len,str2)
替换,从 pos 位开始、长度为 len 的子串替换为 str2。str.replace(it1,it2,str2)
把 str 的迭代器 it1~it2 范围内(左闭右开)的子串替换为str2。
说明:
string::npos
是一个常数,其本身的值等于-1,但由于是unsigned int
类型,因此,也可以认为是unsigned int
类型的最大值。- 上表参数中的 it 为迭代器。
时间复杂度:
O (1):str.length()
str.size()
str.clear()
O (n):str.insert ()
str.erase()
str.replace()
str.substr()
O (n*m):str.find()
相关习题详见: NEFU 大一寒假训练十四(string)2020.02.20