【问题标题】:return pointer to item in vector (from iterator)返回指向向量中项目的指针(来自迭代器)
【发布时间】:2018-10-16 13:15:18
【问题描述】:

我想要一个函数,它遍历一个向量并选择一个元素,然后以指针的形式返回给消费者,即指针应该指向向量中的项目。到目前为止我所拥有的是:

#include <vector>
class data_t {
    public:
    data_t(){mydat=99;}
    ~data_t(){}
    int get_dat(){return mydat;}
    private:
    int mydat;
};
void *myfunc(std::vector<data_t> foo);

int main(void) {
    std::vector<data_t> container;
    data_t tmp;
    data_t *res=nullptr;
    container.push_back(tmp);
    container.push_back(tmp);
    res = (data_t*)myfunc(container);
    res->get_dat();
}
void *myfunc(std::vector<data_t> foo) {
    for (auto itr = foo.begin(); itr != foo.end(); itr++) {
        if (itr->get_dat())
            return &*itr;
    }
    return nullptr;
}

但我不确定return &amp;*itr - 因为首先取消引用迭代器然后返回指针似乎不太合适。另外,即使itr 是本地的,它确实指向全局可用的向量元素。 我怎样才能做得更好?

【问题讨论】:

  • 虽然我不推荐使用当前的设计,但如果foo 是参考,它可以工作。因为它是 foo 是一个副本,所以你要返回一个指针,该指针指向 containercopy 中的元素,该元素在 myfunc 的末尾不再存在。

标签: c++ pointers vector


【解决方案1】:

你可以做得更好 - 目前你的代码的行为是 undefined 因为你通过 foo 所以返回的指针将作为该值无效副本将超出范围。

通过(最好)const 引用传递向量并返回 size_t(或者,迂腐的 std::vector&lt;data_t&gt;::size_type)类型作为索引元素,或 迭代器(您的值 itr)到容器中的元素。

如果使用得当,&amp;* 表示法没有任何问题。在使用智能指针和可选类型时,它会出现相当多的情况。

【讨论】:

  • 谢谢,但是如果我希望能够直接访问 myfunc() 之后的元素,就像在 res-&gt;get_dat(); 中一样 - 我还更新了原始帖子中的代码段。
  • @cerr:返回该元素的索引;后续访问是 O(1);不比指针解引用差。
  • return &amp;*itr; 可以替换为 auto&amp; item = *itr; return &amp;item; 如果 &amp;*itr 冒犯您的风格。 Bathsheba 所说的关于 UB 的内容仍然适用……这也需要修复。但你的问题只是关于&amp;*itr的美学。
【解决方案2】:

这个函数签名对我来说是“错误的”

void *myfunc(std::vector<data_t> foo);

您不应该返回 void *,也不应该按值获取向量。

using data_vec = std::vector<data_t>;
data_vec::iterator myfunc(data_vec & foo);

现在你不必输入main,也不必初始化nullptr

int main(void) 
{
    data_vec container;

    container.emplace_back();
    container.emplace_back();

    auto res = myfunc(container);
    res->get_dat();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2011-12-18
    • 2010-11-16
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多