迭代器是c++中用于遍历容器中的元素的数据类型,但是今天在使用vs2015进行调试的时候,发现对于c++的容器的实现,vs 2015与vc++ 6.0有很大的差异,应该是使用vs进行编译时的一个漏洞吧。
问题起源
关于下面的代码,在vs 2015和vc++ 6.0两个平台上的运行结果大不相同。
#include<string>
#include<iostream>
using namespace std;
void main() {
string start = "ASD";
string::iterator a = start.begin();
printf("%x,%x,%x\n", a,*a,*a);
getchar();
}
在以往使用迭代器的时候,笔者总是使用cout进行输出,但是今天由于一些格式上的原因使用了printf对内容进行输出,但是输出结果与预期差异过大。按照笔者分析,使用printf进行输出,三个内容应该依次为 迭代器指向的地址,’A’的十六进制,’A’的十六进制。但是最后的输出结果却如图所示:
vc++的输出结果和预期的一样,但是为何同样的代码在两个平台上的输出结果不一样呢,这个问题引起了笔者的深思。
测试另一段代码
起初,我以为在c++中,由于容器的结构的原因,printf不能对容器这个对象进行解释,所以不能用printf对容器进行输出*a,因此,我尝试了如下代码,测试能否使用printf输出*a。
#