[TOC] std::copy是C++標準庫中的演算法介面,主要用於兩個容器間的複製,據說其效率要優於自己用for迴圈逐個複製。之前一直非常混淆其中的用法,這裡總結了幾個例子如下: cpp include include include include using namespace std; int ...
目錄
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的容器後面,看起來似乎破壞了這個原則。這也是我之前為什麼搞混淆的原因。看來這個問題有機會還需進一步深究。
最後的運行結果如下: