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
相关文章推荐
- Linux安装卸载MySQL以及修改MySQL初始密码
- Linux下OpenSSL客户端中使用req命令来生成证书的教程
- shell脚本:将指定目录下的执行文件的结果写入指定文件中
- 在hyperpacer基础上进行的自动化性能测试
- linux下查找包含BOM头的文件和清除BOM头命令
- Centos 日志处理
- ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
- WEB系统架构
- Linux CentOS 7 & Apache Tomcat 7 安装与配置
- Ubuntu 12.04下安装OpenCV 2.4.2 和 ffmpeg-0.11.1
- Docker安装
- linux怎么删除文件夹?Linux删除文件夹命令
- java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool异常的解决办法
- servlet之tomcat无法正常启动
- 禅道和自研项目冲突的解决办法
- Castle.Windsor IOC/AOP的使用
- nginx安装
- petapoco 使用 MiniProfiler Glimpse监控
- structs2中,启动Tomcat时异常:严重: Exception starting filter struts2 java.lang.NullPointer...
- Linux系统下安装rz/sz命令及使用说明