7
28
2015
0

VC++和g++编译器的迭代器越界处理


最近被一道今天卡了很久,自己官方数据测是对的,交上去却总是WA……

最后发现是因为本地用的是VC++编译器,而评测时用的是g++,两者的某一些STL迭代器的边界处理是不同的。

对于一般的容器的迭代器,在越界时两者编译的程序都会RE,因为迭代器在实现时都有防越界的处理。但如果用的是基于树的STL容器,如set、multiset、map、multimap等等,就会出现完全不同的情况。

对于VC++编译的程序,如果迭代器越下界,迭代器将会变成end,即容器的最后一个元素的后一个位置,也就是说如果再次递减,迭代器就会指向容器的最后一个元素,这整个过程程序都不会报错。而如果是越上界,则还是RE(为什么不是变成第一个元素,这样和越下界对应起来不是很好吗……

而对于g++编译的程序,越界时好像不会造成任何影响,迭代器原来指哪儿,越界操作后还是指哪儿。但我不是很确定,因为我前几次试验发现是这个结果,后来又试了一次好像不对了……

不过,其实我开头说的那道题目其实确实是我边界没判好,只不过我的程序在使用VC++的越界处理时恰好能AC而已。

所以说,不要去抱怨哪个编译器好,哪个编译器不好,把自己的程序写好,用哪个编译器编译都能正常工作,才是正确的解决方法。

Category: C++ | Tags: STL 迭代器 | Read Count: 746

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com