附加到容器上 我对C++中的泛型算法拷贝有疑问。

附加到容器上 我对C++中的泛型算法拷贝有疑问。,c++,algorithm,C++,Algorithm,要从目标容器ret和源容器bottom进行复制 copy(bottom.begin(), bottom.end(), back_inserter(ret)); 工作但是 copy(bottom.begin(), bottom.end(), ret.end()); 没有。这两种说法有不同的含义吗?检查这两种说法的作用——没有魔法。特别是,copy实际上只是一个循环。简化: template <typename I> void copy(I begin, I end, I targe

要从目标容器
ret
和源容器
bottom
进行复制

copy(bottom.begin(), bottom.end(), back_inserter(ret));
工作但是

copy(bottom.begin(), bottom.end(), ret.end());

没有。这两种说法有不同的含义吗?

检查这两种说法的作用——没有魔法。特别是,
copy
实际上只是一个循环。简化:

template <typename I>
void copy(I begin, I end, I target) {
    while (begin != end)
        *target++ = *begin++;
}
模板
无效副本(我开始、我结束、我目标){
while(开始!=结束)
*目标+=*开始++;
}
而且真正做到了名字所说的


因此,实际上,如果没有
back\u inserter
您就不会扩展目标容器,您只需写过它的末尾:迭代器不会更改其底层容器。另一方面,
back\u inserter
函数创建一个专门的迭代器,该迭代器保存对其原始容器的引用,并在您取消引用并分配给它时调用
push\u back

在第一个函数中,您为copy提供了一个插入方法,以及从哪个容器插入


在第二个例子中,您只给出一个指向容器末尾的指针。

两个都返回迭代器,但是

ret.end()
容器。它可以递减,但不能递增(因为
已指向序列的结尾),并且不能
取消引用,除非它被递减(再次,因为它指向
到序列末尾的一个)

back\u插入器(ret)
是一个返回 一个
back\u insertion\u迭代器
,它是一种非常特殊的 “迭代器”(类别输出迭代器):它是递增的 函数是无操作的,取消引用它将返回此
*和 将值类型分配给它将调用所属对象上的“向后推” 容器。(换句话说,它根本不是迭代器,除了 对于C++标准,但它呈现了一个要做的界面
是的,
复制
覆盖。无法覆盖不存在的内容。back_inserter(ret)和ret.end()有何区别?@ichramm
back_inserter
不是函子。它是一个返回迭代器的函数。一个输出迭代器,
++
是不可操作的,
*
返回
*此
,并且
=
调用实例化容器上的
推回