最近被一道今天卡了很久,自己官方数据测是对的,交上去却总是WA……
最后发现是因为本地用的是VC++编译器,而评测时用的是g++,两者的某一些STL迭代器的边界处理是不同的。
对于一般的容器的迭代器,在越界时两者编译的程序都会RE,因为迭代器在实现时都有防越界的处理。但如果用的是基于树的STL容器,如set、multiset、map、multimap等等,就会出现完全不同的情况。
对于VC++编译的程序,如果迭代器越下界,迭代器将会变成end,即容器的最后一个元素的后一个位置,也就是说如果再次递减,迭代器就会指向容器的最后一个元素,这整个过程程序都不会报错。而如果是越上界,则还是RE(为什么不是变成第一个元素,这样和越下界对应起来不是很好吗……)
而对于g++编译的程序,越界时好像不会造成任何影响,迭代器原来指哪儿,越界操作后还是指哪儿。但我不是很确定,因为我前几次试验发现是这个结果,后来又试了一次好像不对了……
不过,其实我开头说的那道题目其实确实是我边界没判好,只不过我的程序在使用VC++的越界处理时恰好能AC而已。
所以说,不要去抱怨哪个编译器好,哪个编译器不好,把自己的程序写好,用哪个编译器编译都能正常工作,才是正确的解决方法。