介绍
string
是一个封装字符串的容器。
string
定义于头文件 <string>
中,其声明如下:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
// basic_string 为字符串的基础类
// string 则是 basic_string 的一个特例
typedef basic_string<char> string;
初始化
string s;
创建一个空的string
容器。string s;
string s(num,char);
创建一个string
容器,该字符串由 num 个 char 构成。string s(2,'c'); // 字符串为:"ccccc"
string s(str);
创建一个string
字符串,该字符串等于 str。string s("hello"); // 字符串为:"hello"
string s(begin_iterator,end_iterator);
创建一个string
字符串,该字符串由迭代器区间 [begin_iterator,end_iterator) 组成。string s1("hello"); string s(s1.begin(),s1.end());
输入/输出
operator>>
重载输入流操作符,快速实现输入一个字符串 (字符串不能含有空格、tab、换行)。string str; cin >> str; // 如果输入 "hello world",字符串为:"hello"
operator<<
重载输出流操作符,快速实现输出字符串。string str("hello world"); // 输出结果为:"hello world"
getline(ostream,s)
实现读取一行字符。string str; getline(cin,str);
修改
string
容器中访问元素,有以下几种方式:
operator[index]
返回索引位置 index 所指元素的引用。不对访问越界进行检查。cout << s[0] << endl;
at(index)
返回索引位置 index 所指元素的引用。如果访问越界,则抛出异常。cout << s.at(0) << endl;
data()
返回string
底层数组的指针。char* str = s.data();
c_str()
返回string
底层数组的指针,不可修改字符串中元素。
以上 1,2,3 方式都可实现修改操作。
另有一个比较好的方法,可实现赋值操作。
operator=
重载等号运算符,可快速实现赋值操作。string str("hello"); str = "world";
查询
empty()
判断string
容器是否为空。size()/length()
返回string
容器中元素个数。capacity()
返回string
容器当前已分配空间的元素数。max_size()
返回string
容器大小的理论极限值,即当前内存情况下,允许创建string
容器中元素个数的最大可能值。find(str,pos,count)
在 [pos,pos + count) 下标范围内,查找字符串 str 第一次出现的位置,如果存在,则返回下标,否则返回string:npos
。
第三个参数可省略,查询范围至字符串尾。
第二个、第三个参数同时省略,查询范围为整个字符串。
在 [pos,pos + count) 下标范围内查询,这种表述不明确。
应该表述为在 [pos,pos + count + str.size())中,查看是否存在 str 字符串,如果存在则返回 str 字符串第一个字符出现的位置下标。
string s("hello");
int index = s.find("ll"); // index = 2
rfind(str,pos,count)
在(pos-count,pos] 下标范围内,从后向前查找字符串 str 第一次出现的位置,如果存在,则返回下标,否则返回string:npos
。
第三个参数可省略,查询范围至字符串首。
第二个参数、第三个参数同时省略,查询范围为整个字符串。在 (pos-count,pos] 下标范围内查询,这种表述不明确。
应该表述为在 [pos-count,pos + str.size())中,查看是否存在 str 字符串,如果存在则返回 str 字符串第一个字符出现的位置下标。
string str("This is a string");
int index = str.rfind("is",2,1); // index = 2
比较
- 按照字典序列比较
string
中的值。- operator==
- operator!=
- operator<
- operator>
- operator<=
- operator>=
compare(str1)
返回比较 str 和 str1 的结果。
增加
operator+ / operator+=
重载运算符,快速实现增加元素。string str("hello"); str = str + "world"; str += "world"; // 字符串为:"helloworld"
append(str1,pos,count)
将 str1 字符串下标范围为 [pos,pos+count)的字符添加到string
容器尾部。
第三个参数可省略,添加范围至字符串尾。
第二个参数、第三个参数同时省略,添加范围为整个字符串。string str("hello"); string str1("hello"); str.append(str1,0,4); // str 字符串为:"hellohell"
push_back(char)
向string
容器尾部添加一个字符 char。insert(pos,num,char)
向string
容器 pos 位置添加 num 个 char 字符。string str("hello"); str.insert(0,2,'h'); // 字符串为:"hhhello"
insert(pos,str1,pos_str,num)
向string
容器 pos 位置添加一个字符串,该字符串由 str1 中下标区间为 [pos_str,pos_str + num) 中的元素组成。string str("hello"); string str1("hello"); str.insert(0,str1,0,2); // str 字符串为:"hehello"
删除
clear()
清空string
容器。pop_back()
移除string
容器末尾字符。erase(pos,num)
移除string
容器 pos 位置开始的 num 个字符。
其他操作
replace(pos,num,str2,pos_2,num_2)
替换string
容器中 pos 位置开始的 num 个字符,将其替换为 str2 中 pos_2 开始的 num_2 个字符。
其中 pos_2 和 num_2 两个参数可以省略,替换范围为整个字符串。
num_2 参数可以省略,替换范围为至字符串 str 尾。string str("hello"); string str1("jj"); str.replace(2,2,str1,0,2); // str 字符串为:"hejjo"
substr(pos,num)
返回string
容器下标范围为 [pos,pos + num) 的子串。stoi() / stol()
字符串和数字之间的转换函数。