这本书是对的,我只是看错了一句话。
正如@uneven_mark 的回答清楚地指出的那样,以下问题取决于我的误读。
在阅读Josuttis的 C++ 标准库(第 2 版)时,我以某种方式确信coll
在第 457 页被声明为 a std::deque
(相反,它被声明为std::list
!),因此我问了这个问题。
希望可以作为读者的深思。
原始问题:
在“C++ 标准库(第 2 版)”的第 456 页,Josuttis 指出,在您调用之前
copy(coll.begin(), coll.end(), back_inserter(coll));
在 a coll
of class上std::vector
,您必须确保它coll
有足够的空间(在这种情况下,它有capacity
至少两倍的size
),否则
该算法在运行时使传递的源迭代器无效。
相反,在第 458 页,他没有对
copy(coll.begin(), coll.end(), front_inserter(coll));
应用于 a coll
of class std::deque
,即使在第 286 页,针对std::deque
容器指定了以下内容:
[...] 当元素插入到前面或后面时。在这种情况下,对元素的引用和指针保持有效,但迭代器则不然。
因此我怀疑。(是的,我知道std::deque
甚至不提供类似reserve
的成员函数。)
只要我理解了这个答案,我的理解是front_inserter(coll)
迭代器可以导致指针数组的重新分配(这是一种合法的实现方式std::deque
),并且不能导致coll
存储实际元素的数组的重新分配,因此使指向元素的引用/指针有效,同时使iterator
s 无效,其正确行为(我正在考虑如何operator++
实现)依赖于指针数组和指向数组。
copy
如果这是真的,那么我猜想与's参数对应的参数coll.begin()
在分配给它的那一刻会失效,导致指针数组的重新分配。