我已经将一个文本文件加载到缓冲区中,并且想要使用好的C ++样式,使用了vector<char>
。然后我想从所述向量传递迭代器到char*
函数参数 - 我假设在引擎盖下,向量迭代器只是解析为指向成员类型的指针。但是,我收到以下错误:
no known conversion for argument 2 from ‘const __gnu_cxx::__normal_iterator<char*, std::vector<char> >’ to ‘char*’
矢量迭代器不仅仅是指针吗?在这种情况下,只使用指针会更有效吗?
答案 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]。