繁体   English   中英

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

[英]Converting vector iterator to a member pointer

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

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

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

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

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

在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;
}

指针可以用作迭代器,但是vector :: iterator不是指针。 所有这些操作实际上将为您提供相同的指针:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM