2014-10-27 139 views
0

如果我有一个迭代器list<Tree_Node*>::iterator iter,对于用户定义的类Tree_Node,如何通过遍历迭代器返回Tree_Node*指向的对象?它基本上是一个指向指针的指针,不是吗?获取双指针指向的对象

回答

0

您提领迭代器才能到Tree_Node*对象,然后提领那去了Tree_Node

**iter 

比方说,你有一个成员Tree_Node::x,你可以把它称为:

(**iter).x 
(*iter)->x 

它基本上是一个指针指针,不是吗?

在C++中,迭代器抽象意味着有一个非常类似于指针的API ......它们的实现方式并不重要,尽管对于许多容器来说它将是一个指针。

+0

对于我的列表中,我唯一一次添加的东西它是使用'add()'函数。在函数中,我定义了一个Tree_Node *添加到它,并且有一个名称,但我只是这样做以避免使用'new'并且不必担心清理。在函数之外,这个名字没有任何意义。我打算使用for循环访问列表中的每个元素。因为我不能直接使用你给的(** iter).x格式,所以我应该暂时把每个元素的迭代器指针(即'Tree_Node *')指定给一个变量,这样我就可以使用一个名称?或者有更好的方法在循环中做到这一点? – UnworthyToast 2014-10-27 04:54:51

+0

你可以这样做:for(auto&p:my_list)p-> tree_node_operation();' - 这样''p'就是循环中使用的每个连续迭代器值的名称。 – 2014-10-27 06:23:49

0

在C++ 11,你会怎么做:

for(auto node : tree) 
    cout << node->data; 

或者在旧版本:

for(list<Tree_Node*>::iterator node = tree.begin(); node != tree.end(); node++) 
    cout << (*node)->data; 
0

它基本上是一个指针的指针,是不是?

抽象是另一种方式:指针是一种特殊类型的迭代器(以及大概迭代器被建模的东西),而迭代器是一种抽象。但是,你的结论是正确的,就如同用指针的指针,你可以这样做:

list<Tree_Node*>::iterator iter; 
// assign something to iter 
Tree_Node* ptr = *iter; 
Tree_Node& node = *ptr; 

或短:

Tree_Node& node = **iter; 
+0

有趣。那么你能给我一个不是指针的迭代器的例子吗?在本学期几乎没有使用指针但很难想象间接对象访问的另一种方法。 – UnworthyToast 2014-10-27 11:53:19

+0

@UnworthyToast:我们在这里使用的迭代器已经是这样一个例子。 'std :: list '实现了一个链表,所以它的每个节点都必须包含指向下一个和前一个元素的指针。而且,它们不能始终保持在连续的记忆中。 'std :: list :: iterator'可能在内部使用指针,例如解引用不会给你列表的节点,而是持有的内容。 'operator ++()'不会递增内部指针,但将其设置为在“next”字段中找到的指针。 – 2014-10-27 12:24:53

+0

啊哈!这一直困扰着我,但我想我现在就明白了。所以你所说的是迭代器只是一个抽象数据类型,它是在指针之后建模的,事实上它们通常只是指向完成额外的重载操作符。但即使它们本身不是指针,它们通常也是以某种方式依赖指针的结构,如本例中所示。我有这个权利吗? – UnworthyToast 2014-10-27 12:41:56