使用基于范围的 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 中做这件事的好方法?提前致谢!
【问题讨论】:
使ptr1
、ptr2
和ptr3
成为某种容器的元素,而不是不同的变量。
试试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 : &ptr1, &ptr2, &ptr3 ) *item = nullptr;
@RemyLebeau 什么开销?它只是一个包含指针的类。
进行构造和返回对象的函数调用的开销,以及解析reference_wrapper
内部使用的各种模板所需的所有编译器处理。而原始指针是原始指针。
@RemyLebeau 内联扩展的函数调用没有开销。
@RemyLebeau 我同意。 dfri 建议的ptr1 = ptr2 = ptr3 = nullptr;
更好。以上是关于使用基于范围的 for 循环遍历指针列表的主要内容,如果未能解决你的问题,请参考以下文章