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
。