获取双指针指向的对象
Posted
技术标签:
【中文标题】获取双指针指向的对象【英文标题】:Obtaining the object pointed to by a double pointer 【发布时间】:2014-10-27 04:41:25 【问题描述】:如果我有一个迭代器list<Tree_Node*>::iterator iter
,对于用户定义类Tree_Node
,我如何通过迭代器返回Tree_Node*
指向的对象?它基本上是一个指向指针的指针,不是吗?
【问题讨论】:
【参考方案1】:您取消引用迭代器以获取Tree_Node*
对象,然后取消引用该迭代器以获取Tree_Node
:
**iter
假设您有一个成员Tree_Node::x
,您可以将其称为:
(**iter).x
(*iter)->x
它基本上是一个指向指针的指针,不是吗?
在 C++ 中,迭代器抽象旨在拥有一个类似于指针的 API……它们的实现方式并不重要,尽管对于许多容器来说它将是一个指针。
【讨论】:
对于我拥有的列表,我唯一一次添加内容是使用add()
函数。在函数中,我定义了一个 Tree_Node* 来添加它,它有一个名称,但我这样做只是为了避免使用 new
并且不必担心清理。在函数之外,这个名字没有任何意义。我计划使用for
循环访问列表的每个元素。由于我不能直接使用您提供的 (**iter).x 格式,我是否应该暂时将每个元素的迭代器指针(即Tree_Node*
)分配给一个变量,以便我有一个可以使用的名称?或者有没有更好的方法在循环中做到这一点?
您可以执行类似for (auto& p : my_list) p->tree_node_operation();
之类的操作 - 这样p
是每个连续迭代器值的名称,以便在循环中使用。【参考方案2】:
在 C++11 中,你会这样做:
for(auto node : tree)
cout << node->data;
或者在旧版本中:
for(list<Tree_Node*>::iterator node = tree.begin(); node != tree.end(); node++)
cout << (*node)->data;
【讨论】:
【参考方案3】:它基本上是一个指向指针的指针,不是吗?
抽象是另一种方式:指针是一种特殊类型的迭代器(并且可能是迭代器建模的东西),而迭代器是一种抽象。但是你的结论是正确的,就像你可以做的指针一样:
list<Tree_Node*>::iterator iter;
// assign something to iter
Tree_Node* ptr = *iter;
Tree_Node& node = *ptr;
或简称:
Tree_Node& node = **iter;
【讨论】:
有趣。那么你能给我一个不是指针的迭代器的例子吗?这学期除了指针几乎什么都没用,很难想象另一种间接对象访问的方法。 @UnworthyToast:我们在这里使用的迭代器就是这样一个例子。std::list<T>
实现了一个链表,因此它的每个节点都必须包含指向下一个和前一个元素的指针。此外,它们不能总是保存在连续的内存中。 std::list<T>::iterator
可能在内部使用指针,但是,例如取消引用不会给您列表的节点,而是给您保留的内容。 operator++()
不会增加内部指针,而是将其设置为在节点“next”字段中找到的指针。
啊哈!这一直让我感到困惑,但我想我现在明白了。所以你说的是迭代器只是一种以指针为模型的抽象数据类型,实际上它们通常是指针,只是带有额外的重载运算符。但即使它们本身不是指针,它们通常也是以某种方式依赖指针的结构,如这里的示例所示。我有这个权利吗?
@UnworthyToast:是的,你明白了。不过,我不认为将运算符称为“重载”是正确的,因为它们中的大多数只是迭代器类的函数(是的,迭代器是一个特殊的类,为std::list
明确制作)。以上是关于获取双指针指向的对象的主要内容,如果未能解决你的问题,请参考以下文章