【发布时间】:2015-08-18 13:22:46
【问题描述】:
如果我有一个容器的enditerator,但我想获得一个指向它的原始指针,有没有办法做到这一点?
假设我有一个容器:foo。例如,我不能这样做:&*foo.end(),因为它会产生运行时错误:
向量迭代器不可解引用
我可以做到这一点,但我希望有一种更清洁的方式到达那里:&*foo.begin() + foo.size()。
编辑:
这不是关于如何将迭代器转换为一般指针的问题(显然这是问题所在),而是如何专门将结束迭代器转换为指针。 "duplicate" question 中的答案实际上建议取消引用迭代器。结束迭代器不能在没有段错误的情况下被取消引用。
【问题讨论】:
-
&*foo.end()无论如何都没有意义,因为end()是容器的最后一个 元素之后的元素的迭代器,试图访问它会调用UB。 -
您是在询问一般的容器,还是专门询问
vector?正如 LRiO 所说,它甚至没有一般意义。结束迭代器不一定“指向”任何东西,那么指向该位置的指针甚至意味着什么?对于forward_list,结束迭代器通常是一个空指针,因此对于所有列表都是相同的,对于std::list,它指向一个特殊的标记,而不是value_type的元素。 -
@JonathanWakely 我正在尝试完成这样的事情:stackoverflow.com/a/32073224/2642059 所以我需要从
end获得char*。 -
@SingerOfTheFall 我正在尝试完成这样的事情:stackoverflow.com/a/32073224/2642059 所以我需要从
end获得char*。 -
那么你应该将大小添加到第一个元素的地址,我不知道你为什么认为这不干净。如果您有一个将其数据存储在连续数组中的容器,那么指针算法就是正确的方法。
标签: c++ pointers iterator segmentation-fault containers