我被问到这个问题我不知道为什么.
如果你有一个指针int * x;
可以比拟的指针>和<,因为它代表的内存位置类似0x0000 0x0004 0x0008,等我知道迭代器和指针是不同的,但他们以非常相似的方式行事.
例如:
vector<int> myVector;
for(int i = 1; i < 101; i++)
{
myVector.push_back(i);
}
vector<int>::iterator it = myVector.begin();
while(it != myVector.end()) //Why can't we write it < myVector.end()
{
cout << *it << endl;
it++;
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能< myVector.end()在while声明中写出来?我知道这与STL中没有超载有关.然而,写作是&*it < &*myVector.end()有效的,因为它获得了显示说话的内存位置0x0004 0x0008等.
为什么是这样?
在C++中,为什么我们不能使用'>'或'<'来比较InputIterators,ForwardIterators和BidirectionalIterators?但是,我们可以将RandomAccessIterators与'>'或'<'进行比较,例如std :: vector.这背后的原因是什么?
另外,为什么我们不能cout迭代器的内容?例如"cout << itr << endl;" 不行.这背后的原因是什么?迭代器很像指针,但我们可以指出指针而不是迭代器,为什么?
一般来说,迭代器和指针之间的内在差异是什么?我曾经认为它们是相似的,但我想我必须理解这一点才能达到理解c ++的新水平.
问题2:谢谢大家的精彩答案.关于迭代器,我还有一个问题.当迭代器超出界限时,为什么c ++打印出类似"50397953"的东西?不应该打印像NULL或'\ 0'这样的东西吗?
我正在编写一个C++共享库供C程序使用.但是,我有一个关于extern和的问题extern "C".
请考虑以下代码
我的头文件是这样的:
#ifdef __cplusplus
extern "C" int global;
extern "C" int addnumbers(int a, int b);
#else
extern int global;
#endif
Run Code Online (Sandbox Code Playgroud)
这完美无缺; 我只需要申报
int global;
Run Code Online (Sandbox Code Playgroud)
在我的.cpp或我的.c文件中.但是,我不明白的是:
extern "C"和extern这里有什么区别?我试着评论出来extern "C" int global并且有效!为什么?
我知道这extern "C"用于制作C链接.这就是我的原因extern "C" int addnumbers(int,int).换句话说,如果我想编写一个将在C程序中使用的C++函数,我会写extern "C".现在,全球变量怎么样 - 我猜这里的情况有所不同?我想C程序使用一个名为C++变量global,但我可以用extern不extern "C".这是为什么?这对我来说并不直观.
评论:我不认为这是重复的,因为我问的是当你将它用于变量与函数时有什么区别.
我目前正在研究 ELF 格式。我想确认一下我认为正确的事情。
ELF是一种格式,它代表可执行和可链接格式。在linux中,一切都是ELF格式。
当使用gcc编译带有-c和-fPIC文件的代码时,它会将代码转换为ELF格式的.o文件。
如果我说 .o/.so 和 linux 可执行文件是 ELF 文件,是否正确?或者 ELF 是 .o/.so 文件中的东西?换句话说,ELF 是 .o/.so 的子集还是 ELF 基本上是整个 .o/.so?
我想确认这一点,因为我想确保我理解这一点。抱歉问了一个愚蠢的问题。
据我所知,堆栈在C++中没有迭代器.例如,这篇文章(是否std :: stack公开迭代器?)明确指出堆栈没有迭代器.但是,我的主管告诉我,c ++中的堆栈应该有迭代器,因为它是一个标准的数据结构,你可以做stack.begin()(但是,据我所知,标准C++中没有这样的语法).我怎么说服他?为什么堆栈在C++中没有迭代器?
问题2:谢谢大家的精彩答案.我认为现在的问题归结为:为什么没有堆栈迭代器是有意义的?