如果我将iterator
foo
放到容器中,但我想获得一个原始指针,那么有没有办法实现这个目标?
说我有一个容器:&*foo.end()
。我不能这样做:&*foo.begin() + foo.size()
因为它会产生运行时错误:
矢量迭代器不可解除引用
我可以做到这一点,但我希望有一个更清洁的方式到达那里:<?php include 'i_header.tpl';?>
。
修改
这不是关于如何将迭代器转换为指针的问题(显然在问题中),而是如何将结束迭代器专门转换为指针。 "duplicate" question中的答案实际上建议取消引用迭代器。在没有seg-faulting的情况下,结束迭代器不能被解除引用。
答案 0 :(得分:5)
访问存储结束的正确方法是:
v.data() + v.size()
这是因为当*v.begin()
为空时v
无效。
为所有连续容器(data
,vector
和string
)提供了成员函数array
。
从C ++ 17开始,您还可以使用非成员函数:
data(v) + size(v)
这也适用于原始数组。
答案 1 :(得分:4)
一般情况下?否强>
你要问的事实表明你的整体设计出了问题。
对于向量,数组,字符串?当然......但为什么呢?
只需获取指向有效元素的指针,然后将其推进:
std::vector<T> foo;
const T* ptr = foo.data() + foo.size();
只要您不取消引用这样的指针(这几乎等同于解除引用迭代器,就像您在尝试中所做的那样),获取并保持这样的指针是有效的,因为它指向特殊指针 - 过去的位置。
请注意,如果向量为空,&foo[0] + foo.size()
具有未定义的行为,因为&foo[0]
&*(foo.data() + 0)
为&*foo.data()
,并且(就像您的尝试一样){如果没有任何内容,则不允许{1}}。因此,我们避免所有解除引用,只是推进*foo.data()
本身。
无论如何,这只适用于vector 1 ,数组和字符串的情况。其他容器不保证(或可合理预期提供)存储连续性;他们的结束指针几乎可以是任何东西,例如一个“sentinel”空指针,不太可能对你有用。
这就是迭代器抽象首先存在的原因。如果可以的话,坚持下去,而不是深入研究原始指针的使用。
1。除foo.data()
。