无法将迭代器传递给接受指针的函数

Can't pass an iterator to a function which accepts pointer

本文关键字:指针 函数 迭代器      更新时间:2023-10-16

在"Effective STL"技巧16中,它说我们应该避免将迭代器传递给接受指针的函数。谁能给我解释一下细节吗?

void doSomething(const int* pInts, size_t numInts);
vector<int> v;
...
doSomething(&v[0],v.size()) //correct
doSomething(v.begin(),v.size()) //incorrect

在标准库的一些早期实现中,迭代器是作为指针实现的。

依赖于该属性的代码在迭代器变为非指针时停止工作。

所以,你不应该在需要指针的地方传递迭代器,因为如果它编译了,那只是偶然的。迭代器不一定是指针。如果它是指针,那么在以后的版本(库、编译器等)中,它可能不一定是指针。

很简单。

该函数接受一个指针,而不是迭代器。

如果尝试传递迭代器,那么函数调用应该会失败。方钉圆孔


指出:

  • 的逆操作就不一样了,因为指针可以被认为是一种迭代器。通常,接受迭代器的函数可以传递一个指针。

  • 由于实现细节的原因,您的代码可能在某些非常特殊的情况下看起来可以编译。不要被这个欺骗了:它仍然是错误的代码!

因为迭代器根本不是一个原始指针(即使一些底层实现可能是指针)。迭代器有很多种类型:正向、双向、随机访问。最接近指针的迭代器是像vector或deque那样的随机访问迭代器。

迭代器的整个思想是允许灵活地存储不连续存储在内存中的数据。例如,对迭代器进行自增可以移动到数组中的另一个"页",该数组存储为单独的元素块。

如果你调用一个接受指针的函数,被调用的函数将在你给地址加1的时候简单地对地址进行指针算术(因此它不会跟随链表中的链接)。

将迭代器传递给接受指针的函数是无效的。只有在确定容器中的数据是连续存储的情况下,才可以对第一个元素解引用,然后获取其地址。