【问题标题】:Get a pointer to Object from std::vector<Object> in range-based for loop在基于范围的 for 循环中从 std::vector<Object> 获取指向 Object 的指针
【发布时间】: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 问题更有趣的问题是,你想用那个向量做什么?你知道这是不稳定的数据吗?
  • 如果你在填充之后“构造”你的向量,这可能是安全的,这实际上是许多问题中可行的设计。

标签: c++ pointers vector


【解决方案1】:

问题出在这里:

const auto &element : journal

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

只需删除 const 限定符:

auto &element : journal

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

【讨论】:

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