在C ++中,我们为什么不能使用&gt;来比较迭代器?和<! - ?

时间:2016-06-30 10:53:56

标签: c++ loops syntax iterator idiomatic

我被问到这个问题我不知道为什么。

如果你有指针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等的内存位置。

为什么会这样?

3 个答案:

答案 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>也可以与InputIteratorForwardIteratorBidirectionalIterator一起使用。对于示例代码,operator!=it != myVector.end()具有相同的效果,但前者更通用,那么代码也适用于其他迭代器(例如it < myVector.end()或{{1}的迭代器等等。)

BTW:您的示例代码可以使用std::liststd::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()