将向量迭代器转换为成员指针

时间:2013-06-09 02:58:04

标签: c++ vector iterator

我已经将一个文本文件加载到缓冲区中,并且想要使用好的C ++样式,使用了vector<char>。然后我想从所述向量传递迭代器到char*函数参数 - 我假设在引擎盖下,向量迭代器只是解析为指向成员类型的指针。但是,我收到以下错误:

no known conversion for argument 2 from ‘const __gnu_cxx::__normal_iterator<char*, std::vector<char> >’ to ‘char*’

矢量迭代器不仅仅是指针吗?在这种情况下,只使用指针会更有效吗?

3 个答案:

答案 0 :(得分:5)

由于我们正在处理std::vector<char>并且向量保证在内存中是连续的,因此您可以执行func( &(*iteratorVariable) );只需对值进行处理并返回地址。

答案 1 :(得分:3)

一些旧的实现可能会将迭代器实现为指针,但您不应该依赖于此。它们是不同的类型。很难说它们是否更高效,因为您没有显示您的代码。通常它们可以像指针一样高效,但是一些编译器在调试模式下使用特殊的迭代器检查版本,因为它们对程序员错误进行运行时检查,因此速度较慢。

在C ++ 11中将迭代器转换为指针的另一种方法:

#include <vector>

void foo(char*) {}

int main()
{
    std::vector<char> v = { 'a', 'b', 'c' };
    auto it = v.begin() + 1;
    char* p = v.data() + (it - v.begin());
    foo(p);
    return 0;
}

答案 2 :(得分:1)

指针可用作迭代器,但vector :: iterator不是指针。 所有这些操作基本上都会给你相同的指针:

   &v[it-v.begin()]
   v.data() + (it-v.begin())
   &v.front() + (it-v.begin())
   &(*it)    // this one is less safe than others

但是,您应该考虑是否确实需要将迭代器转换为指针。如果您需要指针,最好使用索引:&amp; v [i]。