C++標準庫中copy算法的使用

目錄ios

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的容器後面,看起來彷佛破壞了這個原則。這也是我以前爲何搞混淆的緣由。看來這個問題有機會還需進一步深究。數組

最後的運行結果以下:spa

std::copy
相關文章
相關標籤/搜索