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的容器后面,看起来似乎破坏了这个原则。这也是我之前为什么搞混淆的原因。看来这个问题有机会还需进一步深究。

最后的运行结果如下:

std::copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charlee44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值