头文件:
#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方法,这可能会引起旧元素的析构和新元素的构造。
需要注意两点:
- 如果不使用std::back_inserter,则要保证目标容器的大小不小于源容器;
- 只有实现了push_back的目标容器才可以使用std::copy复制,不然无法编译通过。