文章目录
- 概览
- 标准库中的string类
- 「string类(了解)」
- ﹝编码﹞
- 「string类的常用函数接口」
- ﹝1.string类对象的常见构造﹞
- ﹝2.string类对象的修改操作﹞
- ‹ c_str ›
- ‹ npos ›
- ‹ string结构 ›
- ﹝3.string类对象的容量操作﹞
- ‹ clear ›
- ‹ reserve ›
- ‹ resize ›
- ﹝4.string类对象的访问及遍历操作﹞
概览
标准库中的string类
string(cplusplus.com)
「string类(了解)」
- 字符串是表示字符序列的类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅 basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考 basic_string)。
- 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
﹝编码﹞
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。(字符编码—百度百科)
▪ ASCII:(American Standard Code for Information Interchange)美国信息交换标准代码
▪ GBK:GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)
「string类的常用函数接口」
- #include <string>
- string—constructor.cplusplus.com
﹝1.string类对象的常见构造﹞
函数名称 | 功能说明 |
---|---|
⭐string() | 构造空的string类对象,即空字符串 |
⭐string(const char* s) | 用 常量字符串 来构造string类对象 |
string(size_t n, char c) | 用 n 个字符 c 来构造string类对象 |
⭐string(const string& s) | 拷贝构造函数 |
示例:
#include <string>
using namespace std;
string s1;//调用无参的构造函数,构造空的string类对象
string s2("hello RoundBottle");//用常量字符串构造string类对象
string s3(13, 'x');//用 13个x 构造 string类对象
string s4(s2);//拷贝构造
注意:string 类对象支持直接用 cin 和 cout 进行输入和输出
string s("hello, RoundBottle!");
cout << s << endl;
﹝2.string类对象的修改操作﹞
函数名称 | 功能说明 |
---|---|
push back | 在字符串后尾插字符 |
append | 在字符串后追加一个字符串 |
⭐operator+= | 在字符串后追加字符串str |
⭐c_str | 返回C格式字符串 |
⭐find + npos | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
- 注意:
- 在string尾部追加字符时,s.push_back( c ) / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
- 对string操作时,如果能够大概预估到放多少字符,可以先通过 reserve(下面会介绍)把空间预留好。
- 示例:
‹ c_str ›
std::string::c_str
const char* c_str() const;
ps. cout 会自动识别类型,c_str() 函数的返回值是 const char* ,强制转成 void* 才会打印地址
c_str
接口的意义:为了和C语言的接口兼容
‹ npos ›
public static member constant
static const size_t npos = -1; Maximum value for size_t
size_t
无符号整型→ -1 本质上是整型的最大值!
‹ string结构 ›
- vs下string的结构:先是有一个联合体,联合体用来定义string中字符串的存储空间:
当字符串长度小于16时,使用内部固定的字符数组 (buf[16]) 来存放
当字符串长度大于等于16时,从堆上开辟空间
故:8 + 8 + 8 + 16 = 40字节(如上图所示)
这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
vs 一般是1.5倍扩容
- g++下string的结构
g++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:- 空间总大小
- 字符串有效长度
- 引用计数
- 指向堆空间的指针,用来存储字符串。
g++ 一般是2倍扩容
﹝3.string类对象的容量操作﹞
函数名称 | 功能说明 |
---|---|
⭐size | 返回字符串有效长度 |
length | 返回字符串有效长度 |
capacity | 返回空间的总大小(不包括\0) |
⭐empty | 检测字符串是否为空串,是返回true,否则返回false |
⭐clear | 清空有效字符 |
⭐reserve | 为字符串预留空间 |
⭐resize | 将有效字符的个数改成n个,多出的空间用字符c填充 |
- ‹ size 与 length ›
ps.
size()
与length()
方法底层实现原理完全相同,引入size()
的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
。
- ‹ size && capacity ›
‹ clear ›
清空 string 的内容,size 置零
‹ reserve ›
std::string::reserve
void reserve (size_t n = 0);
Request a change in capacity
Requests that the string capacity be adapted to a plannedchange in size to a length of up to n characters.
If n is greater than the current string capacity, the function causes the container to increase its capacity to n characters (or greater).
In all other cases, it is taken as a non-binding request to shrink the string capacity: the container implementation is free to optimize otherwise and leave the string with a capacity greater than n.
This function has no effect on the string length and cannot alter its content.
- 对于函数所传参数
size_t n
- 默认缺省值为0
- n > current string capacity :该函数会导致容器将其容量增加到 n 个字符(或更大)
- n <= current string capacity :容器实现可以自由优化,否则,字符串的容量大于 n。
‹ resize ›
std::string::resize
void resize (size_t n);
void resize (size_t n,char c);
Resize string
Resizes the string to a length of n characters.
If n is smaller than the current string length, the current value isshortened to its first n character, removing the characters beyond the nth.
If n is greater than the current string length, the current content is extended by inserting at the end as many characters as needed to reach a size of n. If c is specified, the new elements are initialized as copies of c, otherwise, they are value-initialized characters (null characters).
resize:将字符串大小调整为 n 个字符的长度
- n > current string length :删除 n 个字符长度以后的数据
- n >= current string length :在末尾插入所需数量的字符以达到 n 大小来扩展当前内容
﹝4.string类对象的访问及遍历操作﹞
函数名称 | 功能说明 |
---|---|
⭐operator[] | 返回pos位置的字符,const string类对象调用 |
begin+ end | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin + rend | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
范围for | C++11支持更简洁的范围for的新遍历方式 |
void test7()
{string s("abcdefg");string::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}
注:范围for底层也是迭代器
string s("abcdefg");
for (auto ch : s)
{cout << ch << ' ';
}
cout << endl;
END