将向量迭代器转换为指针

pen*_*gon 10 c++

有没有办法将a vector::iterator转换为指针而无法访问向量本身?仅当vector可用时才有效:

typedef vector<int> V;
int* to_pointer1( V& v, V::iterator t )
{
    return v.data() + (t-v.begin() );
}
Run Code Online (Sandbox Code Playgroud)

但是如何在没有vector周围的情况下完成这项工作?这不起作用:

int* to_pointer2( V::iterator t )
{
    // the obvious approach doesn't work for the end iterator
    return &*t;
}
Run Code Online (Sandbox Code Playgroud)

事实上,我本来希望这是一个非常基本和流行的问题,但由于某种原因,我找不到它.

Che*_*Alf 10

一般来说,你不能保证,有 对应于指的是普通的载体项目迭代器的指针.

特别std::vector<bool>是专门的,&*it甚至不会编译.

但是,对于其他的载体,这只是1形式上,迂腐阻止你做&*it也结束迭代.在C99中,正如我记得的那样,&*p当它p是一个结束指针时正式有效,并且目标std::vector是支持所有普通的原始数组符号.如果我需要这个,我会忽略正式迂腐,并编写代码,以期对标准的未来修订将消除那个想象的障碍.

所以,在实践中,就这样做&*it.:)

#include <iostream>
#include <vector>
using namespace std;

auto main() -> int
{
    vector<int> x( 5 );
    cout << &*x.begin() << " " << &*x.end() << endl;
    cout << &*x.end() - &*x.begin() << endl;        // Works nicely IN PRACTICE.
}
Run Code Online (Sandbox Code Playgroud)

但请记住,你不能这样做vector<bool>.


1)其他地方的评论用户十五边形评论:"尝试-D_GLIBCXX_DEBUG,如此处所述:gcc.gnu.org/onlinedocs/libstdc ++/manual/debug_mode_using.html."g ++经常提供一些方法将任何正式的UB带到前面,例如" "正式UB循环的优化".在这种特殊情况下的解决方案只是不要求它这样做,但更一般地,人们可能必须明确地要求它不要这样做.


eca*_*mur 7

不,这目前不可行. n3884 连续迭代器:随机访问迭代器的改进提出了一个std::pointer_from满足您要求的自由函数:

表达式: std::pointer_from(a)
返回类型: reference
操作语义: if a是可解除引用的std::address_of(*a); 否则,如果a可以从可解除引用的迭代器访问b,std::pointer_from(b) + (a – b); 否则是有效的指针值([basic.compound]).