在基于范围的 for 循环中从 std::vector<Object> 获取指向 Object 的指针

Posted

技术标签:

【中文标题】在基于范围的 for 循环中从 std::vector<Object> 获取指向 Object 的指针【英文标题】:Get a pointer to Object from std::vector<Object> in range-based for loop 【发布时间】:2018-02-11 18:41:39 【问题描述】:

我有一个对象向量 - journal:

    std::vector<Object> journal;
    std::vector<Object*> filteredJournal;
    for (const auto &element : journal) 
            if (element.data[1] == user) 
                filteredJournal.push_back(&element);
            
    

我想用来自journal 的指向特定对象的指针填充指向这些对象的指针向量filteredJournal。我试图在element 上使用&amp;,但当然它给了我一个错误,我为push_back() 函数提供了错误的参数。这样做的正确方法是什么?

【问题讨论】:

比解决你的 constness 问题更有趣的问题是,你想用那个向量做什么?你知道这是不稳定的数据吗? 如果你在填充之后“构造”你的向量,这可能是安全的,这实际上是许多问题中可行的设计。 【参考方案1】:

问题出在这里:

const auto &element : journal

您为每个元素绑定一个 const 引用。因此,当您使用它获取地址时,您会得到一个指向 const 元素的指针。而且你不能将它传递给一个函数,该函数需要一个指向非 const 限定对象的指针。

只需删除 const 限定符:

auto &element : journal

关于迭代器、引用和指针失效的常见警告当然适用。确保filteredJournal 的持续时间不超过保证其指针指向有效对象的时间跨度。

【讨论】:

也许应该补充一点,在向量中存储指向元素的指针通常不是一个好主意。 @super - 在合理的时间内存储非拥有指针没有问题。 OP 的帖子中没有任何内容表明他们不这样做。 @StoryTeller 当然,但是对于发现这篇文章的初学者来说,如果使用不正确,几行代码告诉指针可能会失效,这仍然是 IMO 的一个有价值的补充。 @StoryTeller 但是如果journal 的容量增加,指针很容易失效。存储索引可能是更安全的选择。 @juanchopanza - 有可能,也有可能不可能,这取决于需要对这些指针进行什么进一步处理。

以上是关于在基于范围的 for 循环中从 std::vector<Object> 获取指向 Object 的指针的主要内容,如果未能解决你的问题,请参考以下文章

r值上基于范围的for循环

在 Qt 中正确使用 C++11 基于范围的 for 循环

如何在 std::map 中使用基于范围的 for() 循环?

如何在 std::map 中使用基于范围的 for() 循环?

临时范围上的基于范围的for循环[重复]

C++11 基于范围的for循环