前言:STL(Standard Template Library,标准模板库)是C++标准库的重要组成部分,它提供了一系列通用的数据结构和算法。在STL中,string类是一个非常重要的容器,用于处理字符串数据。本文将详细介绍STL中的string类,包括其基本概念、常用操作以及使用示例
STL的六大组件
string类是一个模板类,专门用于处理字符串数据。 在C++中,字符串是由一系列字符组成的序列,而string类则提供了对这些字符序列进行高效操作的功能。与传统的C语言风格字符串(以\0结尾的字符数组)相比,string类更加安全和易用,因为它会自动管理内存,并提供了丰富的成员函数来操作字符串
string类成员函数:
class string
{
private:
char* ——str;
int _capacity;
int _size;
};
函数名称 | 功能说明 |
---|---|
string() | 构造空的string类对象,即空字符串 |
string(const char* s) | 用const对象来构造string类对象 |
string(size_t n, char c) | string类对象中包含n个字符c |
string(s.begin(), s.end()) | 用迭代区间构造 |
string(const string&s) | 拷贝构造函数 |
int main()
{
string s1(); // 空字符串
string s2("hello world"); // const对象构造string类对象
string s3(10, 'x'); // n个字符c构造
string s4(s2.begin(), s2.end()); // 用迭代区间构造
string s5 = s2; // 拷贝构造
return 0;
}
注意:在这里迭代器类似于指针!
函数名称 | 功能说明 |
---|---|
size | 返回字符串有效字符长度 |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty | 检测字符串释放为空串,是返回true,否则返回false |
clear | 清空有效字符 |
reserve | 为字符串预留空间 |
resize | 将有效字符的个数该成n个,多出的空间用字符c填充 |
int main()
{
string s("hello world");
// 返回字符串有效字符长度
cout << s.size() << endl;
cout << s.length() << endl;
// 返回空间总大小
cout << s.capacity() << endl;
// 检测字符串释放为空串,是返回true,否则返回false
cout << s.empty() << endl;
// 清空有效字符
s.clear();
cout << "clear after: " << s << endl;
// 为字符串预留空间
s.reserve(100); // 一般会多预留空间
cout << "reserve(100)after: " << s.size() << endl;
cout << "reserve(100)after: " << s.capacity() << endl;
cout << endl;
// 将有效字符的个数该成n个,多出的空间用字符c填充
s.resize(100);
cout << "resize(100)after: " << s.size() << endl;
cout << "resize(100)after: " << s.capacity() << endl;
return 0;
}
注意:
函数名称 | 功能说明 |
---|---|
operator[ ] | 返回pos位置的字符,const string类对象调用 |
begin+ end begin | 获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin + rend begin | 获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭器 |
范围for | C++11支持更简洁的范围for的新遍历方式 |
int main()
{
string s("hello world");
for (int i = 0; i < s.size(); i++)
{
cout << s[i];
}
cout << endl;
// 迭代器
string::iterator it = s.begin();
while (it != s.end())
{
cout << *it;
it++;
}
cout << endl;
// 范围for
for (auto ch : s)
{
cout << ch;
}
cout << endl;
return 0;
}
关于迭代器
迭代器的用法像指针一样能够+–也可以解引用拿到指向的内容
函数名称 | 功能说明 |
---|---|
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+= | 在字符串后追加字符串str |
c_str | 返回C格式字符串 |
find + npos | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
注意:npos是无符号的整形,值为-1,npos是int的最大值
int main()
{
string s1("h");
// 插入字符
s1.push_back('e');
//插入字符串
s1.append("llo ");
s1 += "world";
// 将s1变成 hello world
//c_str函数返回字符串从\0结尾的字符串,但是c++中的字符串不一定
s1 += '\0';
s1 += "aaa";
cout << s1 << endl; // hello worldaaa
cout << s1.c_str() << endl; // hello world
// find 从pos位置开始查找字符并返回其位置
// rfind 从pos位置开始往前查找字符并返回其位置
int ret = s1.find('l',3);
cout << s1[++ret] << endl; // o
//substr 从ret位置开始截取pos个字符,如果pos不传参数将会截取到最后
string s2 = s1.substr(0);
cout << s2 << endl; // hello worldaaa
return 0;
}
这里要注意的是:
c_str
,C格式字符串是以’\0’结尾的但是C++里面不一定substr
,当我们没有结束位置时,它会遍历完整个字符串insert
和erase
,但是这两个涉及挪动数据,效率不高,能不用就不用string s1("hello world!!!");
// 头插
s1.insert(0, 1, 'x');
// 删除
s1.erase(0,5);
我们来查阅一下这三个函数
insert
可以在pos位置插入一个字符,一个字符串或者一个string类甚至还可以指定插入字符串的长度,insert接口有很多
erase
可以删除从pos位置往后len个字符,如果pos不传参数,则从0位置删除npos个
getline
是用于从输入流中读取一行字符串并保存到指定的字符串变量中的函数,直到遇到换行符或达到指定的最大字符数
代码演示:
int main()
{
string s;
getline(cin, s);
cout << s << endl;
cout << endl;
cin >> s;
cout << s << endl;
return 0;
}
在深入学习和掌握了STL中string类的运用后,我们可以深刻感受到C++在处理字符串时的灵活性和高效性。通过合理利用string提供的各种成员函数和特性,实现更加高效且易于维护的代码。对于学习后面的STL容器也有很大帮助! 谢谢大家支持本篇到这里就结束了,祝大家天天开心!