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方法的扩容机制不是在原有的基础上加大容量,而是重新申请请的大的容量空间,而原有的迭代器指向的位置是原来的空间位置,不会随着容量的变化而更新,再用原来的迭代器去访问内容,当然是不对的,原理就在此处。