C++中string迭代器与reserve函数的冲突

1、迭代器做为容器与算法之间的桥梁方便了各种场景与功能的实现;
2、string类的迭代器相当于char*的指针;
3、string在被初始化或赋值后系统会分配一定大小的容量(mac下默认为22,超出后15+16*n);
4、string可通过capacity查看当前容量大小;
5、string可通过reserve()方法来修改容量大小(只能改大,改小则保持当前容量不变);
6、如果调用reserve方法成功修改容量大小后,再使用原来的迭代器来访问内容,会出现异常;
7、代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main(){
    string str("ABCDEFG");
    // 输出字符串str的容量大小(22)
    cout << str.capacity() << endl;
    // 创建一个迭代器,并指向str的开始位置
    string::iterator iter = str.begin();
    // 验证输出迭代器的位置
    cout << "iter:" << iter[0] << endl;
    // 扩容str的容量大小(超过初始22,15+16=31)
    str.reserve(23);
    cout << str.capacity() << endl;
    // 验证输出迭代器的位置,内容为空。
    cout << "iter:" << iter[0] << endl;
    return 0;
}

8、结果输出
22
iter:A
31
iter:
Program ended with exit code: 0
9、原因分析:reserve方法的扩容机制不是在原有的基础上加大容量,而是重新申请请的大的容量空间,而原有的迭代器指向的位置是原来的空间位置,不会随着容量的变化而更新,再用原来的迭代器去访问内容,当然是不对的,原理就在此处。

Leave a Reply