C++ C++;在编程中,迭代器是指针,即使它没有声明为指针

C++ C++;在编程中,迭代器是指针,即使它没有声明为指针,c++,class,pointers,C++,Class,Pointers,考虑以下几行 std::map<char,int> mymap; std::map<char,int>::iterator it; /* not std::map<char,int>::iterator *it; */ std::map mymap; std::map::iterator;/*不是std::map::iterator*it*/ 在第二行中,尽管它没有声明为指针,但如何使用类似于下面的箭头运算符(->)访问元素 std::cout <&

考虑以下几行

std::map<char,int> mymap;
std::map<char,int>::iterator it; /* not std::map<char,int>::iterator *it; */
std::map mymap;
std::map::iterator;/*不是std::map::iterator*it*/
在第二行中,尽管它没有声明为指针,但如何使用类似于下面的箭头运算符(->)访问元素

std::cout << it->first << " => " << it->second << '\n';

std::cout首先您可以为类重载
->
操作符,这正是这里发生的事情

另一个例子:

class Hello
{
public:
    void Show()
    {
        printf("Hello, world!");
    }
};

class MyClass
{
private:
    Hello hello;

public:

    Hello * operator -> ()
    {
        return &hello;
    }
};


int main(int argc, char * argv[])
{
    MyClass m;

    m->Show();
}

您可以为类重载
->
运算符,这正是这里发生的情况

另一个例子:

class Hello
{
public:
    void Show()
    {
        printf("Hello, world!");
    }
};

class MyClass
{
private:
    Hello hello;

public:

    Hello * operator -> ()
    {
        return &hello;
    }
};


int main(int argc, char * argv[])
{
    MyClass m;

    m->Show();
}

就像你可以使用
一样,迭代器应该是这样工作的,就像指针,即使它们不是指针。就像你可以使用
一样,迭代器应该是这样工作的,就像指针,即使它们不是指针。所以使用点(.)运算符可以吗std::cout@Dinesh为什么不试试呢?@Dinesh因为迭代器应该像指针一样工作,它们当然也定义了一个解引用运算符,所以您可以执行
(*it)。首先
。但是,迭代器本身基本上是“黑匣子”,没有指定它们的实现方式,只有它们的接口(它们应该支持哪些重载运算符等)和它们的行为(如递增时应该发生什么)@Spook我试过并得到了这个映射。cpp:35:error:“struct std::_Rb_tree_iterator”没有名为“first”的成员,所以它的意思是,你不能这样做:)当你使用
->
时,iterator会返回你一些东西,一个名为
first
的成员是什么,这就是为什么这段代码工作正常。但是迭代器本身没有一个字段
first
。所以使用点(.)操作符它会工作吗std::cout@Dinesh为什么不试试呢?@Dinesh迭代器应该像指针一样工作,它们当然也定义了一个解引用操作符,所以你可以执行
(*it)。first
。但是,迭代器本身基本上是“黑匣子”,没有指定它们的实现方式,只有它们的接口(它们应该支持哪些重载运算符等)和它们的行为(如递增时应该发生什么)@Spook我试过并得到了这个映射。cpp:35:error:“struct std::_Rb_tree_iterator”没有名为“first”的成员,所以它的意思是,你不能这样做:)当你使用
->
时,iterator会返回你一些东西,一个名为
first
的成员是什么,这就是为什么这段代码工作正常。但是迭代器本身没有一个字段
first