首页 > 解决方案 > C++:std::list 之间的区别和 std::list<*type>

问题描述

我目前正在学习 C++,我已经看到一个迭代器执行以下操作:

for(std::list<Type*>::iterator iter = list.begin();
 iter != list.end(); ++iter) {

 if (!isInRange(**iter)) {
 iter = list.erase(**iter);
 }
}

现在,我的问题是:我如何知道是否使用了双指针?要获取 iter 的对象,解决方案使用两个**,但迭代器的声明将类型定义为单指针,而不是双指针:<Type*>std::list<Type*>和有区别std::list<*Type>吗?如果*类型右侧的 a 表示它是双指针,那么我会理解为什么我需要使用两个**来获取对象。

非常感谢您!乔达

标签: c++

解决方案


专注于您的主要问题:

如何知道是否使用了双指针

您正在创建一个存储 Type ( Type*) 类型指针的列表,并且您正在使用 astd:list<T>:iterator来迭代此列表。

迭代器基本上引用列表的一个节点。“根据定义”,它是一个指针。

您存储在列表中的值是类型 (Type*) 的指针。您正在使用迭代器引用一个值 (Type*)。

  • 变量 iter 是您的迭代器。它引用了您列表中的一个值(类型*)。
  • 该指令*iter将返回一个Type*(类型的指针Type)。
  • 该指令**iter将返回一个Type(类型的值Type)。

总结起来,你总是需要使用*iter来获取迭代器引用的值。如果您**iter创建了一个存储指针的列表并且想要获取存储在列表中的指针引用的值,则需要。

关于您提供的代码的最后一行,iter = list.erase(**iter)您必须使用iter而不是**iter,因为该erase方法需要一个迭代器作为参数,而不是一个Type.

最后,如果您创建一个列表Type而不是列表Type**iter将返回一个类型的值Type

请尝试以更清晰的方式提出您的问题。


推荐阅读