无法将迭代器传递给接受指针的函数
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
在标准库的一些早期实现中,迭代器是作为指针实现的。
依赖于该属性的代码在迭代器变为非指针时停止工作。
所以,你不应该在需要指针的地方传递迭代器,因为如果它编译了,那只是偶然的。迭代器不一定是指针。如果它是指针,那么在以后的版本(库、编译器等)中,它可能不一定是指针。
很简单。
该函数接受一个指针,而不是迭代器。
如果尝试传递迭代器,那么函数调用应该会失败。方钉圆孔
指出:
-
的逆操作就不一样了,因为指针可以被认为是一种迭代器。通常,接受迭代器的函数可以传递一个指针。
-
由于实现细节的原因,您的代码可能在某些非常特殊的情况下看起来可以编译。不要被这个欺骗了:它仍然是错误的代码!
因为迭代器根本不是一个原始指针(即使一些底层实现可能是指针)。迭代器有很多种类型:正向、双向、随机访问。最接近指针的迭代器是像vector或deque那样的随机访问迭代器。
迭代器的整个思想是允许灵活地存储不连续存储在内存中的数据。例如,对迭代器进行自增可以移动到数组中的另一个"页",该数组存储为单独的元素块。
如果你调用一个接受指针的函数,被调用的函数将在你给地址加1的时候简单地对地址进行指针算术(因此它不会跟随链表中的链接)。
将迭代器传递给接受指针的函数是无效的。只有在确定容器中的数据是连续存储的情况下,才可以对第一个元素解引用,然后获取其地址。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址