繁体   English   中英

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

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

在“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

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

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

所以,你不应该传递一个预期指针的迭代器,因为如果它编译那么它只是偶然的机会。 迭代器不一定是指针。 如果它是一个指针,那么它可能不一定是某个更高版本(库,编译器等)的指针。

这很简单。

该函数采用指针,而不是迭代器。

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


笔记:

  • 逆是不一样的,因为指针可以被认为是一种迭代器。 通常,采用迭代器的函数可以传递指针。

  • 由于实现细节,您的代码可能会在某些非常具体的情况下编译。 不要让这个欺骗你:它仍然是错误的代码!

因为迭代器根本不是原始指针(即使某些底层实现可能是指针)。 有许多类型的迭代器:foward,双向,随机访问。 与指针最接近的迭代器是一个随机访问迭代器,如一个向量或deque。

迭代器的整个想法是启用不连续存储在内存中的灵活数据存储。 例如,递增迭代器可以移动到数组中的另一个“页面”,该数组存储为单独的元素块。

如果你调用一个带有指针的函数,被调用的函数只会在递增时对地址进行指针运算(因此它不会跟随链表中的链接)。

将迭代器传递给带指针的函数是行不通的。 只有在您确定容器中的数据是连续存储的情况下,取消引用第一个元素然后获取其地址才有效。 这适用于矢量,但如果容器是列表则无法工作。

暂无
暂无

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

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