Abstract
Keywords C++  Stl 
Citation Yao Qing-sheng.C++ Stl 中容器使用的小技巧及坑 1.FUTURE & CIVILIZATION Natural/Social Philosophy & Infomation Sciences,20210422. https://yaoqs.github.io/20210422/c-stl-zhong-rong-qi-shi-yong-de-xiao-ji-qiao-ji-keng-1/

以 vector 为例,在使用 auto 关键字重命名容器时容易遇到,使用新命名变量操作容器时,明明已经 clear 或 erase 掉了容器,但是再次绑定使用容器时发现容器仍然有数据,未删除数据。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()
    等等。
    ————————————————
    版权声明:本文为 CSDN 博主「紫霄宫中布道者」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/yaokingson/article/details/116015000

References