使用基于范围的 for 循环遍历指针列表

Posted

技术标签:

【中文标题】使用基于范围的 for 循环遍历指针列表【英文标题】:using a range-based for-loop to iterate through a list of pointers 【发布时间】:2020-10-09 12:13:36 【问题描述】:

大家好,

我一直在尝试使用以下代码将列表中的所有指针重置为 nullptr,如下所示:

    for (auto item :  ptr1, ptr2, ptr3 )
        item = nullptr;

问题是对item做了一个指针的拷贝,所以原来的ptrs最后不等于nullptr。

我想获得对指针本身的某种引用,或者也许已经有更好的替代方法来将容器中的所有指针设置为 nullptr。如果你们中的任何人碰巧使用 Qt,也许有一个在 Qt 中做这件事的好方法?提前致谢!

【问题讨论】:

使ptr1ptr2ptr3 成为某种容器的元素,而不是不同的变量。 试试auto& item 这能回答你的问题吗? ***.com/questions/59899291/… @AlanBirtles 这不起作用,请参阅:***.com/questions/64279834/… 【参考方案1】:

如果您要输入单个指针变量,为什么不直接使用链式赋值?

ptr1 = ptr2 = ptr3 = nullptr;  // All three pointers are nullptr.

DEMO.


[...] 或者也许已经有更好的替代方法将容器中的所有指针设置为nullptr

如果与单独的命名指针变量相比,您的指针位于实际容器中,则可以使用基于范围的 for 循环来写入和读取容器的指针元素:

#include <array>
#include <ios>
#include <iostream>

// Container of 'pointer-to-const-int' elements.
using MyPointersArray = std::array<int const*, 3>;

void inspectNullptrness(const MyPointersArray& arr) 
    for (const auto& p : arr) 
        std::cout << std::boolalpha 
            << (p == nullptr) << " ";
    


int main() 
    MyPointersArray pointersnullptr, nullptr, nullptr;
    const int a = 42;
    inspectNullptrness(pointers); // true true true
    
    // Set pointers.
    for(auto& p : pointers)  p = &a; 
    inspectNullptrness(pointers); // false false false
    
    // Reset pointers.
    for(auto& p : pointers)  p = nullptr; 
    inspectNullptrness(pointers); // true true true

【讨论】:

【参考方案2】:

我想得到一些参考

您正在使用该大括号初始化列表创建一个std::initializer_list。不幸的是,这样的列表总是包含副本,您不能通过该列表分配用于初始化它的变量。

您可以使用参考包装器:

for (auto ref :  std::ref(ptr1), std::ref(ptr2), std::ref(ptr3) )
    ref.get() = nullptr;

如果您使用指针数组而不是单独的变量,那么迭代它们将是微不足道的:

T* ptrs[3];
for (auto& ptr : ptrs)
    ptr = nullptr;

【讨论】:

在第一个示例中,您可以替代地使用指针到指针元素,然后您不必使用reference_wrapper 涉及任何开销,例如:for (auto item : &amp;ptr1, &amp;ptr2, &amp;ptr3 ) *item = nullptr; @RemyLebeau 什么开销?它只是一个包含指针的类。 进行构造和返回对象的函数调用的开销,以及解析reference_wrapper 内部使用的各种模板所需的所有编译器处理。而原始指针是原始指针。 @RemyLebeau 内联扩展的函数调用没有开销。 @RemyLebeau 我同意。 dfri 建议的ptr1 = ptr2 = ptr3 = nullptr; 更好。

以上是关于使用基于范围的 for 循环遍历指针列表的主要内容,如果未能解决你的问题,请参考以下文章

使用for循环遍历python中的列表

为啥 for 循环不遍历列表中的每个项目?

Networkx:通过循环遍历节点列表添加属性时,IndexError:列表索引超出范围

当我遍历我的列表时,返回列表索引超出范围

Python:使用 while 或 for 循环遍历列表

使用 For Each 循环遍历列表时删除列表中的项目