您的位置:首页 > 运维架构

std::copy()和std::back_inserter()用法

2016-04-22 11:58 239 查看
#include "stdafx.h"
#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复制,不然无法编译通过。

参考:http://blog.chinaunix.net/uid-22671442-id-3502337.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: