【博客12】STL中erase函数要根据容器来使用!

内容: 今天记录下STL中erase函数用来删除容器中元素的时候,他在序列容器和非序列容器的差距,erase函数在序列容器下会返回下一个有效的迭代器,但是在非序列容器下,它的返回值是void的。这也会带来编程上对不同容器的不同处理。

测试代码:
【博客12】STL中erase函数要根据容器来使用!
【博客12】STL中erase函数要根据容器来使用!
测试结果:结果正确,因为在VS下已经实现了对Associative Container的返回迭代器的erase。但是在c++标准中是序列容器erase函数返回下一个有效值,非序列容器不返回。(可以见effective STL和跟erase函数有关的资料),同时在旧版的g++编译器编译不通过,因为没有实现,新版本的g++已经实现了。

新版g++测试:
【博客12】STL中erase函数要根据容器来使用!
测试结果:【博客12】STL中erase函数要根据容器来使用!

建议:对非序列容器的erase写成后置自增的形式,以避免移植到没有为非序列容器设计返回迭代器的erase函数的系统上无法使用,导致出错。

通用版本代码:
【博客12】STL中erase函数要根据容器来使用!
感受:
1.很多书上的测试代码,在实际电脑中测试是不存在问题的或者与书里是有差距.
2.越来越让我明白很多东西离开编译器去讨论是没有意义的(比如测试虚函数表和虚基类表的时候,我在linux下测试就发现是统一在一起了,因此只要一个虚指针指向一个虚表,两个表的内容都写在一个表,但是在vs下我打印出类布局,发现虚函数表指针和虚基类表指针是都存在的,可见有些问题在vs和g++下两者差异较大)
3.c++11的auto关键字在使用容器时,用来定义迭代器真的很方便,不用再写一大堆定义前缀了。
4.实践出真理

大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。