以vector为例,在使用auto 关键字重命名容器时容易遇到,使用新命名变量操作容器时,明明已经clear或erase掉了容器,但是再次绑定使用容器时发现容器仍然有数据,未删除数据。示例代码如下:
using namespace std;
vector<int> asdfghjklqwertyuio[100][100];
...
for(int i=0i<100;i++)
{
for(int j=0;j<100;j++)
{
auto vec=asdfghjklqwertyuio[i][j];
vec.size();//这里重新进入大小都会恢复,造成上次clear没有清理/删除的假象
vec.clear();
vec.erase(vec.begin(),vec.begin()+10;
vec.size();//这里会变为0
}
}
究其原因是因为 auto vec=asdfghjklqwertyuio[i][j]; 采用了拷贝机制,vec为 asdfghjklqwertyuio[i][j] 的副本,对vec的操作并未作用到原始容器中,而只是对vec的操作。
解决方法:
1. 使用左值引用(建议) auto& vec=asdfghjklqwertyuio[i][j];
2.使用骚操作指针 auto vec=&asdfghjklqwertyuio[i][j]; 后期使用容器时使用 (*vec).begin()等等。