头文件:

#include <iterator>

函数原型:

1
2
template <class Container>
  back_insert_iterator<Container> back_inserter (Container& x);

用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <vector>
#include <iterator>     //包含了std::back_inserter的定义

class A
{
public:
    A()
    {
        t = 9;
    }

    ~A()
    {
        t = 7;
    }

private:
    int t;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> v1(3, 10);
    std::vector<int> v2(4, 9);
    std::copy(v1.begin(), v1.end(), v2.begin());
    std::vector<int> v3(1);
    //下列这行代码会导致程序崩溃,因为目标容器v3的大小必须大于等于源容器的大小v1
    //std::copy(v1.begin(), v1.end(), v3.begin());
    //为了解决这个问题可以使用std::back_inserter()函数。
    std::copy(v1.begin(), v1.end(), std::back_inserter(v3));

    std::vector<A*> v4;
    v4.push_back(new A());
    v4.push_back(new A());
    v4.push_back(new A());

    std::vector<A*> v5(4);
    //不会引起新元素的构造函数执行,这样v5中的元素如果不显式delete会不会引起内存泄露?
    std::copy(v4.begin(), v4.begin() + 1, v5.begin());

    std::vector<A> v6;
    A a;
    v6.push_back(a);
    v6.push_back(a);
    v6.push_back(a);
    std::vector<A> v7(4);
    //向v7中复制元素不会引起新元素的构造函数执行
    std::copy(v6.begin(), v6.begin() + 1, v7.begin());

    return 0;
}

如果不使用std::copy达到同样的效果,则必须先clear或者erase方法,这可能会引起旧元素的析构和新元素的构造。

需要注意两点:

  1. 如果不使用std::back_inserter,则要保证目标容器的大小不小于源容器;
  2. 只有实现了push_back的目标容器才可以使用std::copy复制,不然无法编译通过。