返回指向向量中项目的指针(来自迭代器)

Posted

技术标签:

【中文标题】返回指向向量中项目的指针(来自迭代器)【英文标题】: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 的末尾不再存在。 【参考方案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();

【讨论】:

以上是关于返回指向向量中项目的指针(来自迭代器)的主要内容,如果未能解决你的问题,请参考以下文章

关于向量、指针和迭代器的问题

通过向量迭代(使用迭代器)会导致 SIGSEGV 但在索引中使用时有效 - 那怎么样?

将指针转换为迭代器

为啥 min_element() 返回最小元素的索引,而不是迭代器?

stl中vector中erase后迭代器为啥会失效

3.4 迭代器