我想有一个遍历向量并选择一个元素的函数,然后将其以指针的形式返回给使用者,即指针应指向向量中的项目。到目前为止,我有:
#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
是局部的,它也指向全局可用的向量元素。
我该如何做得更好?
答案 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();
}