在基于范围的 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
上使用&
,但当然它给了我一个错误,我为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 的指针的主要内容,如果未能解决你的问题,请参考以下文章
如何在 std::map 中使用基于范围的 for() 循环?