我对C ++中的通用算法copy
有疑问。
从目标容器ret
和源容器bottom
,
copy(bottom.begin(), bottom.end(), back_inserter(ret));
有效但
copy(bottom.begin(), bottom.end(), ret.end());
没有。这两个陈述有不同的含义吗?
答案 0 :(得分:5)
检查语句的作用 - 不涉及任何魔法。特别是,copy
(基本上)只是一个循环。简化为:
template <typename I>
void copy(I begin, I end, I target) {
while (begin != end)
*target++ = *begin++;
}
而back_inserter
确实就是名字所说的。
所以实际上,没有 back_inserter
你没有扩展目标容器,你只需写完它的结尾:迭代器不会改变它们的底层容器。另一方面,back_inserter
函数创建一个专门的迭代器, 保存对其原始容器的引用,并在取消引用并分配给它时调用push_back
。
答案 1 :(得分:2)
在第一个中,您将复制一个插入方法,以及从哪个容器插入。
在第二个中,你只给出一个指向容器末端的指针。
答案 2 :(得分:1)
两者都返回迭代器,但是......
ret.end()
返回指向结尾的迭代器
容器。它可以递减,但不递增(因为它
已经指向序列的结尾),它不可能
取消引用,除非它减少(再次,因为它指出
到序列结束的一个)。
back_inserter(ret)
是一个返回的函数
一个back_insertion_iterator
,这是一种非常特殊的类型
“iterator”(类别OutputIterator):它的增量
函数是no-ops,取消引用它返回*this
,和
为其分配值类型在所有者上调用push_back
容器。 (换句话说,它根本不是迭代器,除了
对于C ++标准;但它提供了一个要做的界面
一些非常不同的东西。)