获取原始指针到容器的末尾

时间:2015-08-18 13:22:46

标签: c++ pointers iterator segmentation-fault containers

如果我将iterator foo放到容器中,但我想获得一个原始指针,那么有没有办法实现这个目标?

说我有一个容器:&*foo.end()。我不能这样做:&*foo.begin() + foo.size()因为它会产生运行时错误:

  

矢量迭代器不可解除引用

我可以做到这一点,但我希望有一个更清洁的方式到达那里:<?php include 'i_header.tpl';?>

修改

这不是关于如何将迭代器转换为指针的问题(显然在问题中),而是如何将结束迭代器专门转换为指针。 "duplicate" question中的答案实际上建议取消引用迭代器。在没有seg-faulting的情况下,结束迭代器不能被解除引用。

2 个答案:

答案 0 :(得分:5)

访问存储结束的正确方法是:

v.data() + v.size()

这是因为当*v.begin()为空时v无效。

为所有连续容器(datavectorstring)提供了成员函数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()