返回指向向量中项目的指针(来自迭代器)
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 &*itr
- 因为首先取消引用迭代器然后返回指针似乎不太合适。另外,即使itr
是本地的,它确实指向全局可用的向量元素。
我怎样才能做得更好?
【问题讨论】:
虽然我不推荐使用当前的设计,但如果foo
是参考,它可以工作。因为它是 foo
是一个副本,所以你要返回一个指针,该指针指向 container
的 copy 中的元素,该元素在 myfunc
的末尾不再存在。
【参考方案1】:
你可以做得更好 - 目前你的代码的行为是 undefined 因为你通过 foo
值 所以返回的指针将作为该值无效副本将超出范围。
远通过(最好)const
引用传递向量并返回 size_t
(或者,迂腐的 std::vector<data_t>::size_type
)类型作为索引元素,或 迭代器(您的值 itr
)到容器中的元素。
如果使用得当,&*
表示法没有任何问题。在使用智能指针和可选类型时,它会出现相当多的情况。
【讨论】:
谢谢,但是如果我希望能够直接访问myfunc()
之后的元素,就像在 res->get_dat();
中一样 - 我还更新了原始帖子中的代码段。
@cerr:返回该元素的索引;后续访问是 O(1);不比指针解引用差。
return &*itr;
可以替换为 auto& item = *itr; return &item;
如果 &*itr
冒犯您的风格。 Bathsheba 所说的关于 UB 的内容仍然适用……这也需要修复。但你的问题只是关于&*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 但在索引中使用时有效 - 那怎么样?