我被问到这个问题我不知道为什么。
如果你有指针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++;
}
为什么我们不能在< myVector.end()
声明中写while
?
我知道这与STL中没有超载有关。但是,编写&*it < &*myVector.end()
是有效的,因为它获取了显示说0x0004 0x0008
等的内存位置。
为什么会这样?
答案 0 :(得分:9)
<ul>
<li>
<a href="#">MENU</a>
</li>
<li>
<a href="#">CARDS</a>
</li>
<li>
<a href="#">CONTACT</a>
</li>
</ul>
和operator<
只能与RandomAccessIterator一起使用。但operator>
也可以与InputIterator,ForwardIterator和BidirectionalIterator一起使用。对于示例代码,operator!=
和it != myVector.end()
具有相同的效果,但前者更通用,那么代码也适用于其他迭代器(例如it < myVector.end()
或{{1}的迭代器等等。)
BTW:您的示例代码可以使用std::list
或std::map
,因为std::vector
的迭代器是operator<
。
答案 1 :(得分:4)
std::vector::iterator
是一个随机访问迭代器,您当然可以将它们与<
和>
进行比较。
但是,只能使用==
和!=
之外的任何内容来比较随机访问迭代器。双向,转发和输入迭代器仅定义相等/不等式比较运算符。
例如,std::list::iterator
是指向std::list
的某个未指定成员的迭代器。在这种情况下,对任何其他类型的比较都毫无意义。
答案 2 :(得分:0)
问题是<
和>
不能总是与迭代器一起使用,因为只有某种迭代器支持这样的操作(即随机访问迭代器等) )。另一方面,!=
等比较操作总是可用。
现在,如果<
具有相同的效果并始终有效,为什么要关注使用>
和!=
?
假设您有一些通用代码:
template <class It>
void foo(It begin, It end)
{
while (--end != begin)
apply(*begin);
}
例如,代码将编译为指针,但它不会导致myList.begin()
。