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

时间:2018-10-16 13:15:18

标签: c++ pointers vector

我想有一个遍历向量并选择一个元素的函数,然后将其以指针的形式返回给使用者,即指针应指向向量中的项目。到目前为止,我有:

#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 &*itr-因为似乎不应该首先取消引用迭代器然后返回指针。另外,即使itr是局部的,它也指向全局可用的向量元素。 我该如何做得更好?

2 个答案:

答案 0 :(得分:4)

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

通过(最好是)const引用传递向量,并返回size_t(或者,在传统上是std::vector<data_t>::size_type )的类型,以表示元素的索引,或者为容器中元素的 iterator (您的值为itr)。

正确使用&*表示法没什么问题。在使用智能指针和可选类型时,它会产生一些效果。

答案 1 :(得分: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();
}