C++标准库中copy算法的使用
std::copy是C++标准库中的算法接口,主要用于两个容器间的复制,据说其效率要优于自己用for循环逐个复制。之前一直非常混淆其中的用法,这里总结了几个例子如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
	//vector复制到vector
	{
		vector<int> src = { 0, 1, 2, 3, 4 };
		vector<int> dst(8, -1);
		std::copy(src.begin(), src.end(), dst.begin());
		for (int i = 0; i < dst.size(); i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
	//vector插入到vector末尾
	{
		vector<int> src = { 0, 1, 2, 3, 4 };
		vector<int> dst = { -10, -9 };
		std::copy(src.begin(), src.end(), std::back_inserter(dst));
		for (int i = 0; i < dst.size(); i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
	//set插入到vector
	{
		set<int> src = { 4, 3, 2, 1, 0 };
		vector<int> dst;
		std::copy(src.begin(), src.end(), std::back_inserter(dst));
		for (int i = 0; i < dst.size(); i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
	//数组插入到vector
	{
		int src[5] = { 0, 1, 2, 3, 4 };
		vector<int> dst;
		std::copy(src, src+5, std::back_inserter(dst));
		for (int i = 0; i < dst.size(); i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
	//vector插入到数组
	{
		vector<int> src = { 0, 1, 2, 3, 4 };
		int dst[8] = { -1 };
		std::copy(src.begin(), src.end(), dst);
		for (int i = 0; i < 8; i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
	//数组插入到数组
	{
		int src[5] = { 0, 1, 2, 3, 4 };
		int dst[8] = { -1 };
		std::copy(src, src + 5, dst);
		for (int i = 0; i < 8; i++)
		{
			cout << dst[i] << '\t';
		}
		cout << endl;
	}
}
这个例子虽然繁复,但是确实表达了STL算法(algorithms)接口的原则:STL算法不负责空间申请操作,只负责相应行为,接口中容器的大小应该预先申请好。但是,这里有的例子用到了std::back_inserter,也就是插入迭代器,会将元素自动插入到支持push_back的容器后面,看起来似乎破坏了这个原则。这也是我之前为什么搞混淆的原因。看来这个问题有机会还需进一步深究。
最后的运行结果如下:

C++标准库中copy算法的使用的更多相关文章
- STL笔记(6)标准库:标准库中的排序算法
		
STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...
 - 8、泛型程序设计与c++标准模板库4.标准c++库中的算法
		
标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...
 - 彻底弄清c标准库中string.h里的常用函数用法
		
在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...
 - 用CAS操作实现Go标准库中的Once
		
Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...
 - 通过atomic_flag简单自旋锁实现简单说明标准库中锁使用的memory_order
		
在使用标准库中的加锁机制时,例如我们使用std::mutex,写了如下的代码(下面的代码使用condition_variable可能更合适) std::mutex g_mtx; int g_resNu ...
 - Python 标准库中的装饰器
		
题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...
 - (转)python标准库中socket模块详解
		
python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...
 - c/c++标准库中的文件操作总结
		
1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...
 - C标准库中atoi的一种可能的实现
		
为避免与标准库中的atoi产生歧义, 我将自己编写的函数命名为strToInt, 以下是示例代码 #include <stdio.h> int strToInt(const char *s ...
 - php标准库中的优先队列SplPriorityQueue怎么使用?(继承)
		
php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...
 
随机推荐
- springboot整合redis报错:链接失败; Unable to connect to Redis
			
springboot整合redis报错:链接失败:org.springframework.data.redis.RedisConnectionFailureException: Unable to c ...
 - jq工具及其常用用法
			
近来在工作中处理JSON处理较多,深入研究了一下jq,之前对jq的使用一直停留在JSON数据格式化的层面,实际它的能力远不止于此. 在处理JSON数据时,我们经常需要在命令行中进行过滤.查询和编辑的操 ...
 - 详解GuassDB数据库权限命令:GRANT和REVOKE
			
本文分享自华为云社区<GuassDB数据库的GRANT & REVOKE>,作者: Gauss松鼠会小助手2 . 一.GaussDB的权限概述 在数据库中,对象的创建者将成为该对象 ...
 - MySQL索引、事务与存储引擎
			
MySQL索引.事务与存储引擎 索引介绍 1.索引的概念 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址). 使用 ...
 - Langchain-Chatchat项目:4.2-P-Tuning v2使用的数据集
			
本文主要介绍P-tuning-v2论文中的5种任务,分别为Glue任务.NER任务.QA任务.SRL任务.SuperGlue任务,重点介绍了下每种任务使用的数据集. 一.Glue任务 GLUE ...
 - 24. 从零用Rust编写正反向代理,细说HTTP行为中的几种定时器
			
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...
 - 使用GPT4进行数据分析,竟然被他骗了
			
上周,OpenAI开发者大会上OpenAI发布了一系列震撼人心的功能.而最让我感兴趣的,就是GPT4的数据分析功能了.话不多说,赶紧上号体验一下. 在最新登录GPT4的时候,都会有下面这个提示,目前已 ...
 - React 中事件处理
			
不要问自己需要什么样的人生,而要问自己想要成为什么样的人. 我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的.这里我们认识逻辑构造之事 ...
 - scrum|敏捷开发之任务看板
			
上篇文章中,我讲了敏捷第一步-每日站立会,讲了我们平时是怎么开站立会的,其实15-30分钟就够了,绝对不是时间长得让你想拄拐那种.本文我们开始讲敏捷开发中的看板.没有看板之前,我们真的是在白板上画泳道 ...
 - 09 - Shell流程控制语句
			
1. if-else语句 能够使用if条件语句进行条件判断 1.1 if 语法 if 条件 then 命令 fi if 条件; then 命令; fi 1.2 if-else 语法 if 条件 the ...