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

时间:2011-08-09 09:36:47

标签: c++

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

4 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

这很简单。

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

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


注意:

  • 反转不一样,因为指针可以被认为是一种迭代器。通常,带有迭代器的函数可以传递一个指针。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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