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


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM