在“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
答案 0 :(得分:11)
在标准库的一些早期实现中,迭代器被实现为指针。
当迭代器变为非指针时,依赖于该属性的代码停止工作。
所以,你不应该传递一个预期指针的迭代器,因为如果它编译那么它只是偶然的机会。迭代器不一定是指针。如果它是一个指针,那么它可能不一定是某个更高版本(库,编译器等)的指针。
答案 1 :(得分:2)
这很简单。
该函数采用指针,而不是迭代器。
如果您尝试传递迭代器,那么函数调用应该会失败。方形钉,圆孔。
反转不一样,因为指针可以被认为是一种迭代器。通常,带有迭代器的函数可以传递一个指针。
由于实现细节,您的代码可能会在某些非常具体的情况下编译。不要让这个欺骗你:它仍然是错误的代码!
答案 2 :(得分:1)
因为迭代器根本不是原始指针(即使某些底层实现可能是指针)。有许多类型的迭代器:foward,双向,随机访问。与指针最接近的迭代器是一个随机访问迭代器,如一个向量或双端队列。
答案 3 :(得分:0)
迭代器的整个想法是启用不连续存储在内存中的灵活数据存储。例如,递增迭代器可以移动到数组中的另一个“页面”,该数组存储为单独的元素块。
如果你调用一个带有指针的函数,被调用的函数只会在递增时对地址进行指针运算(例如,它不会跟随链表中的链接)。
将迭代器传递给接受指针的函数是行不通的。只有在您确定容器中的数据是连续存储的情况下,取消引用第一个元素然后获取其地址才有效。这适用于矢量,但如果容器是列表则无法工作。