string类的出现是对于C语言中的str系列库函数的升级版,主要是用来处理一系列字符串类型的操作,具有相当大的作用,这里我们介绍其几个常用的接口,并在下一篇文章中通过代码模拟出其在底层的实现。
1. string类对象的常见构造
函数名称 | 函数功能 |
---|---|
string() | 构造空的string类对象,即空字符串 |
string(const string&s) | 拷贝构造函数 |
string (const string& str, size_t pos, size_t len = npos) | 从当前字符串的第pos个位置获取len个元素的字符串 |
string(const char* s) | 用一个字符串常量来构造string类对象 |
string (const char* s, size_t n) | 从一个字符串中获取n个元素 |
string(size_t n, char c) | string类对象中包含n个字符c |
使用string类代码演示:
#include<string>
#include<iostream>
using namespace std;
void test()
{
string str1;//创建空的string对象
string strcopy(str1);//通过str1创建拷贝的string对象
string str3("abcd");//通过常量字符串创建string对象
string str4("abcdefg", 1,2);//从当前字符串的第1个位置获取两个元素作为str4中的字符串
string str5(str3, 2);//从一个string类对象的字符串中获取2个字符
string str6(6, 'a');//创建一个由6个a组成的字符串
}
int main()
{
test();
return 0;
}
2.string类对象的赋值
string& operator= (const string& str) | 赋值对象是一个string对象 |
---|---|
string& operator= (const char* s) | 赋值对象是一个字符串常量 |
string& operator= (char c) | 赋值对象是一个字符 |
使用string类代码演示:
string str1;
string str2(6, 'a');//创建一个由6个a组成的字符串
str1 = str2;//赋值对象是一个string对象
string str3;
str3 = "abcde";//赋值的对象是一个字符串常量
string str4;
str4 = 'a';//复制到对象是一个字符
3.string类对象字符访问
方式一、通过[]
char& operator[] (size_t pos) | 访问一个位置,返回引用,可以修改 |
---|---|
const char& operator[] (size_t pos) const | 访问一个位置,返回const引用,不可修改 |
const char& ch=str1[2];
ch='b';//会报错不可修改
char& ch1=str2[3];
ch1='d';//允许修改
方式二、通过at
char& at (size_t pos) | 访问一个位置pos,返回引用,可以修改 |
---|---|
const char& at (size_t pos) const | 访问一个位置,返回const引用,不可修改 |
const char& ch=str1.at(2);
ch='b';//会报错不可修改
char& ch1=str2.at(3);
ch1='d';//允许修改
【区别】
[]越界会报断言错误
at越界会抛出异常
4.string类对象的容量操作
size | 返回字符串有效字符长度,不包括’\0’ |
---|---|
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty | 检测字符串释是否为空串,是返回true,否则返回false |
clear | 清空有效字符 |
reserve | 为字符串预留空间,即开辟指定字符串存储空间 |
resize | 将有效字符的个数扩展成n个,多出的空间用指定值填充 |
代码示例:
string str1;
cout << str1.size() << endl;
str1.resize(10);//预留10个空间
cout << str1.size() << endl;
string str2("123456");
cout <<"the size is :"<< str2.size() << endl;//size表示有效字符的长度
cout <<"the length is :"<< str2.length() << endl;//length表示有效字符的长度
cout << "the capacity is :"<<str2.capacity() << endl;//默认开辟容量为十五
str2.resize(10, 'a');//预留10个空间,多余的空间用字符a填充
cout << str2<< endl;
cout <<"the str2 is empty?: "<< str2.empty() << endl;//判断是否为空的字符串,是则返回true,不为空则返回false
str2.clear();
cout << "the change size is :" << str2.size() << endl;
cout << "the change length is :" << str2.length() << endl;
cout << "the change capacity is :" << str2.capacity() << endl;
对应代码输出如图:
5.string类中的迭代器
iterator begin() | 指向第一个元素,可以进行修改,访问时若需要访问下一个位置则加加 |
---|---|
const_iterator begin() const | 指向第一个元素,不可以进行修改,访问时若需要访问下一个位置则加加 |
iterator end() | 指向最后一个元素的下一个位置,可以修改,,访问时若需要访问下一个位置,则减减 |
const_iterator end() const | 指向最后一个元素的下一个位置,不可以修改,,访问时若需要访问下一个位置,则减减 |
reverse_iterator rbegin() | 反向迭代器,指向最后一个元素的位置,可以修改,访问时若需要访问前一个位置则加加 |
const_reverse_iterator rbegin() const | 反向迭代器,指向最后一个元素的位置,不可以修改,访问时若需要访问前一个位置则加加 |
reverse_iterator rend() | 反向迭代器,指向第一个元素的前一个位置,可以修改,访问时若需要访问下一个位置,则减减 |
const_reverse_iterator rend() const | 反向迭代器,指向第一个元素的前一个位置,不可以修改,访问时若需要访问下一个位置,则减减 |
代码示例如下
string str1("abcdefg");
const string str2("123456");
string::iterator it1 = str1.begin();//begin迭代器,可以修改
cout << "it1: " << *it1 << endl;
string::const_iterator it2 = str2.begin();//常量下begin迭代器,不可以修改
cout << "it2: " << *it2 << endl;
string::iterator it3 = str1.end();//begin迭代器,可以修改
cout << "it3: " << *(it3-1) << endl;
string::const_iterator it4 = str2.end();//常量下begin迭代器,不可以修改
cout << "it4: " << *(it4-1) << endl;
string::reverse_iterator it5 = str1.rbegin();//rbegin反向迭代器,可以修改
cout << "it5: " << *it5 << endl;
string::const_reverse_iterator it6 = str2.rbegin();//rbegin反向迭代器,不可以修改
cout << "it6: " << *it6 << endl;
string::reverse_iterator it7 = str1.rend();//rend反向迭代器,可以修改
cout << "it7: " << *(it7-1) << endl;
string::const_reverse_iterator it8 = str2.rend();//rend反向迭代器,不可以修改
cout << "it8: " << *(it8-1)<< endl;
6.三种常见遍历方式
方式一、通过[]
for (size_t i=0;i<str.size();++i)
{
.....
}
方式二、通过for
for(const auto& ch : str)//要自己写begin,end迭代器
{
...
}
方式三、迭代器
string::iterator it=str.begin;
while(it != str.end())
{
...
it++;
}