学习String的时候我是对照https://legacy.cplusplus.com/这个网站进行理解
标准库中的String类
- string类的基础
- String的特点
- String常用的接口(黑框标记的是常用接口)
- 构造函数
- string类对象的访问及遍历操作
- 第一种 下标+[ ]
- 第二种 迭代器
- 第三种 范围for
string类的基础
- 字符串是表示字符序列的类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
单字节字符字符串的设计特性。 - string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
息,请参阅basic_string)。 - string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 - 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
简单来说:
String是C++标准模板库(STL)的一部分,它封装了字符数组,并提供了一系列操作字符串的方法。要使用String的时候,你需要包含头文件<string>
。
#include <string>
std::string str = "Hello, World!";
String的特点
- 动态大小:string可以动态地增长和缩小,不需要预先指定大小。
- 操作简便:提供了丰富的成员函数来执行常见的字符串操作,如连接、分割、查找和替换。
- 易于集成:可以与C++的其他特性,如迭代器、算法等无缝集成。
String常用的接口(黑框标记的是常用接口)
构造函数
1.string();
构造空的string类对象,即空字符串
2.string(const string&str);
拷贝构造函数
3.string (const string& str, size_t pos, size_t len = npos);
复制str中从字符位置pos开始并跨越len个字符的部分(如果str太短或len给的值是npos,则复制到str的末尾)
4.string(const char* s);
用C-string(C语言的方法)来构造string类对象
6.string(size_t n, char c);
string类对象中包含n个字符c
#include <iostream>
#include <string>
using namespace std;
void Teststring1()
{
string s1; // 构造空的string类对象s1
string s2("hello world"); // 用C格式字符串构造string类对象s2
string s3(s2,6,5);
string s4(s2); // 拷贝构造s3
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
}
string类对象的访问及遍历操作
第一种 下标+[ ]
1.size
返回字符串的长度,以字节为单位。
2.operator[]
返回对字符串中位置为pos的字符的引用,作用是自定义类型能向内置类型上使用。在下面的程序里operator[]模仿的是数组访问的行为
void Teststring2()
{
string s1("hello world");
for (int i = 0; i < s1.size();i++)
{
cout << s1[i] << " ";
}
for (int i = 0; i < s1.size(); i++)
{
cout << s1.operator[](i) << " ";
}
cout << endl;
}
注意:
第二种 迭代器
1.capacity
返回当前为字符串分配的存储空间的大小,以字节表示
2.Iterator
(迭代器)
提供了一种统一的方式来访问和操作容器中的元素,而不需要关心容器的具体类型。迭代器类似于指针,它们指向容器中的某个元素,并且提供了一系列操作来遍历容器。
3.end
返回一个迭代器,该迭代器指向字符串的末尾之后的字符,最后一个数据的下一个位置
void Teststring3()
{
string s1("hello world");
string::iterator it1 = s1.begin();
while (it1 != s1.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
}
第三种 范围for
范围for不仅能遍历数组也能遍历容器
void Teststring4()
{
string s1("hello world");
for (auto e : s1)
{
cout << e << " ";
}
cout << endl;
}
范围for自动取容器(s1)中的数据给e,自动向后迭代,自动结束(其实底层就是迭代器)