将向量迭代器传递给函数c++

Passing vector iterator to a function c++

本文关键字:函数 c++ 向量 迭代器      更新时间:2023-10-16

有人能向我解释为什么下面的段编译了,但后面的注释行没有编译吗?

struct tObj
{
    int data;
    int moreData;
}
...
void funcToCall (tObj *obj, int moreData)
{
    //Useful stuff here
}
void mainFunction ()
{
    vector<tObj>::iterator it = vectorOfObjects.begin(); //assumes vectorOfObjects is already defined
    while (it != vectorOfObjects.end())
    {
        funcToCall (&(*it), 0); //This line works
        funcToCall (it, 0); //This line produces an error
        it++;
    }
}

产生的错误是:

error: cannot convert ‘std::vector<tObj>::iterator {aka __gnu_cxx::__normal_iterator<tObj*, std::vector<tObj> >}’ to ‘tObj*’

关于为什么&(*it)有效而普通it无效,有什么想法吗?从逻辑上讲,它们是一样的,不是吗?

因为*不是指取消引用吗?&不是指通过引用,也就是相互抵消吗?

it是一个迭代器对象,按原样传递它意味着您试图为期望tObj*的函数传递vector<tObj>::iterator类型的对象,从而导致错误。

当你执行*it时,你会得到迭代器所代表的底层对象,当你在其上应用&时,你就会得到该对象的地址,其类型为tObj*,与函数的参数类型一致,因此没有错误。

要编译代码,必须声明一个重载函数,如

void funcToCall ( std::vector<tObj>::iterator it, int moreData)
{
    //Useful stuff here
}

在一般情况下,类型tObj *vector<tObj>::iterator是不同的类型,尽管在std::vector的一些旧实现中,它的迭代器确实被定义为指针。。