zoukankan      html  css  js  c++  java
  • 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] << '	';
      		}
      		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] << '	';
      		}
      		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] << '	';
      		}
      		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] << '	';
      		}
      		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] << '	';
      		}
      		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] << '	';
      		}
      		cout << endl;
      	}    
      }
      

      这个例子虽然繁复,但是确实表达了STL算法(algorithms)接口的原则:STL算法不负责空间申请操作,只负责相应行为,接口中容器的大小应该预先申请好。但是,这里有的例子用到了std::back_inserter,也就是插入迭代器,会将元素自动插入到支持push_back的容器后面,看起来似乎破坏了这个原则。这也是我之前为什么搞混淆的原因。看来这个问题有机会还需进一步深究。

      最后的运行结果如下:

      std::copy

    • 相关阅读:
      asp.net Ctrl+回车提交
      Request.Form.Keys保存的是什么?
      让iframe子窗体取父窗体地址栏参数(querystring)
      Repeater在无数据记录时显示类似GridView空模板(EmptyDataTemplate)
      jQuery与javascript对照学习(获取父子前后元素)
      internet缓存Temp中的tmp文件
      C#反射遍历一个对象属性(小技巧)
      silverlight序列化反序列化,在c#其他程序反序列化
      Silverlight序列化反序列化(json.net)
      卸载oracle
    • 原文地址:https://www.cnblogs.com/charlee44/p/12404632.html
    Copyright © 2011-2022 走看看