问题
请看如下两个代码
代码1
#include<iostream>
#include<string>
using namespace std;
int main(){
string a,b;
a.append("hello");
b.append("hello");
if(a == b) cout << "a == b" << endl;
else cout << "a != b" << endl;
return 0;
}
代码2
#include<iostream>
#include<string>
using namespace std;
int main(){
string a,b;
a.resize(10);
a.append("hello");
b.append("hello");
if(a == b) cout << "a == b" << endl;
else cout << "a != b" << endl;
return 0;
}
问:两份代码的输出分别是什么?
答:
第一份代码输出a == b
,第二份代码输出a != b
。
分析
这里要注意调用resize函数的效果。
使用resize函数能够修改容器的size。
如果
原
s
i
z
e
<
目
标
s
i
z
e
原size < 目标size
原size<目标size,即原本容器中元素个数小于目标个数,则会使用默认值扩充至目标数额。
因此要特别注意容器在使用resize函数后进行容器间比较可能存在的问题(如示例代码)。
注:欢迎阅读我的另一篇文章了解更多:vector size max_size capacity区别与理解
补充
当对初始分配空间可能较小的容器进行随机访问时,可能会出现越界访问的情况。
这时可能会使用函数resize调整长度大小,避免越界问题的发生。如以下代码所示。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> a;
a.resize(10); // 要对a[9]进行访问,需要保证容器的size至少为9
a[9] = 100;
return 0;
}
当应该注意resize函数实际上可能会对原本容器中的末尾进行增加/删减操作。
那么新问题来了,是否可以用reserve函数代替resize函数避免此类越界问题的发生呢?答案是不可以。
具体原因欢迎阅读的另外一篇文章了解:关于使用reserve函数取代resize函数避免越界的问题
注意:这里的容器特指具有顺序存储结构的STL容器。
原创不易,感谢支持。