附加到容器

时间:2014-01-27 17:11:08

标签: c++ algorithm

我对C ++中的通用算法copy有疑问。

从目标容器ret和源容器bottom

进行复制
copy(bottom.begin(), bottom.end(), back_inserter(ret));

有效但

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

没有。这两个陈述有不同的含义吗?

3 个答案:

答案 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 ++标准;但它提供了一个要做的界面 一些非常不同的东西。)