在C ++中将迭代器与NULL进行比较时出现编译错误

时间:2018-04-01 18:54:00

标签: c++ pointers stl iterator

我用C ++编写了一个示例代码来检查向量中的元素:

#include <iostream>
#include <vector>


using namespace std;


int main()
{
    vector<int> myVec;


    myVec.push_back(1);
    myVec.push_back(2);
    myVec.push_back(3);
    myVec.push_back(4);


    vector<int>::iterator it = NULL; // compilation error

    for(it = myVec.begin(); it != NULL; it++)  // compilation error
    {
        if((*it == 3)
        {
            cout << "3 is found\n"; 
            break;
        }
    }

    if(it == NULL) // compilation error
    {
        cout << "3 is not found\n";
    }

    return 0;

}

在编译此代码时,我在代码中标记为注释的以下行中收到编译错误。

我已经读过,迭代器只是指针应该如何行走的包装器。那么,为什么迭代器不能设置或与NULL比较?

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

您应该将itmyVec.end()进行比较。这就是矢量迭代器的工作方式。

所以,

vector<int>::iterator it = NULL; // compilation error
for(it = myVec.begin(); it != NULL; it++)  // compilation error
...
if(it == NULL) // compilation error

变为

vector<int>::iterator it = myVec.begin();
for (; it != myVec.end(); it++)
...
if (it == myVec.end())

auto it = myVec.begin();
for (; it != myVec.end(); it++)
...
if (it == myVec.end())

答案 1 :(得分:1)

您应该将其与myVec.end()进行比较,而不是NULL

Iterator是一个类,而不是指针。因此将它与NULL进行比较毫无意义。您可以在此处查看:iterator

答案 2 :(得分:1)

  

我已经读过,迭代器只是指针应该如何行走的包装器。那么,为什么迭代器不能设置或与NULL比较?

迭代器不是指针的“包装器”。但是让我们假装它。这是否意味着它可以与NULL进行比较?

让我们退后一步,想一想其他东西的“包装”,比如int

struct WrapperOfInt
{
    int x;
};

然后实例化它:

WrapperOfInt w;

那么你可以将它与int进行比较吗?

w == 1;
不,你不能。 WrapperOfInt不是int期。你无法比较它们。

通过类比,即使迭代器是指针的包装,它也不是指针。您无法将其与NULL进行比较。