如果我有一个迭代器list<Tree_Node*>::iterator iter
,对于用户定义的类Tree_Node
,如何通过遍历迭代器返回Tree_Node*
指向的对象?它基本上是一个指向指针的指针,不是吗?获取双指针指向的对象
回答
您提领迭代器才能到Tree_Node*
对象,然后提领那去了Tree_Node
:
**iter
比方说,你有一个成员Tree_Node::x
,你可以把它称为:
(**iter).x
(*iter)->x
它基本上是一个指针指针,不是吗?
在C++中,迭代器抽象意味着有一个非常类似于指针的API ......它们的实现方式并不重要,尽管对于许多容器来说它将是一个指针。
在C++ 11,你会怎么做:
for(auto node : tree)
cout << node->data;
或者在旧版本:
for(list<Tree_Node*>::iterator node = tree.begin(); node != tree.end(); node++)
cout << (*node)->data;
它基本上是一个指针的指针,是不是?
抽象是另一种方式:指针是一种特殊类型的迭代器(以及大概迭代器被建模的东西),而迭代器是一种抽象。但是,你的结论是正确的,就如同用指针的指针,你可以这样做:
list<Tree_Node*>::iterator iter;
// assign something to iter
Tree_Node* ptr = *iter;
Tree_Node& node = *ptr;
或短:
Tree_Node& node = **iter;
有趣。那么你能给我一个不是指针的迭代器的例子吗?在本学期几乎没有使用指针但很难想象间接对象访问的另一种方法。 – UnworthyToast 2014-10-27 11:53:19
@UnworthyToast:我们在这里使用的迭代器已经是这样一个例子。 'std :: list
啊哈!这一直困扰着我,但我想我现在就明白了。所以你所说的是迭代器只是一个抽象数据类型,它是在指针之后建模的,事实上它们通常只是指向完成额外的重载操作符。但即使它们本身不是指针,它们通常也是以某种方式依赖指针的结构,如本例中所示。我有这个权利吗? – UnworthyToast 2014-10-27 12:41:56
- 1. 获取对象指针指向
- 2. 设置指向对象的指针,让对象指向对方
- 3. 获取指向持久化对象的指针
- 4. boost :: gil指向bgr8_view_t对象的指针
- 5. 指向对象开始的指针(C++)
- 6. 指向对象类型的指针
- 7. 解引用指向对象的指针
- 8. GetModuleHandle获取指向IMAGE_DOS_HEADER的指针?
- 9. 指针帮助,指向对象的指针和类
- 10. 传递对象指针作为指向基类的指针
- 11. 获取应用对象的指针
- 12. 获取类对象的指针
- 13. 指向一维数组的双指针
- 14. 可以将指向子对象的指针视为指向父对象的指针吗?
- 15. 由双指针指向的指针值丢失(c代码)
- 16. 创建一个指向抽象对象的指针向量
- 17. 取消分配指向对象的指针数组?
- 18. 使用双向弱指针
- 19. ,对象和指向对象的指针有什么区别?
- 20. 指向指针的指针和指向数组的指针
- 21. 如何在std :: map中获取指向一对的指针
- 22. 指针指向指针
- 23. 获取(指向)调用对象
- 24. 搜索对象指针的向量
- 25. 创建指针对象的向量
- 26. 针对缓冲区的指针与双指针
- 27. 双指针指向字符串采取导致段故障
- 28. 指向抽象类的指针数组
- 29. 向量含有矢量对象指针的最终指向同一对象
- 30. 指向Struct的指针的指针
对于我的列表中,我唯一一次添加的东西它是使用'add()'函数。在函数中,我定义了一个Tree_Node *添加到它,并且有一个名称,但我只是这样做以避免使用'new'并且不必担心清理。在函数之外,这个名字没有任何意义。我打算使用for循环访问列表中的每个元素。因为我不能直接使用你给的(** iter).x格式,所以我应该暂时把每个元素的迭代器指针(即'Tree_Node *')指定给一个变量,这样我就可以使用一个名称?或者有更好的方法在循环中做到这一点? – UnworthyToast 2014-10-27 04:54:51
你可以这样做:for(auto&p:my_list)p-> tree_node_operation();' - 这样''p'就是循环中使用的每个连续迭代器值的名称。 – 2014-10-27 06:23:49