簡單的程式詮釋C++ STL算法系列之十三:copy
前面十二個演算法所展現的都屬於非變易演算法(Non-mutating algorithms)系列,現在我們來看看變易演算法。所謂變易演算法(Mutating algorithms)就是一組能夠修改容器元素資料的模板函式,可進行序列資料的複製,變換等。
我們現在來看看第一個變易演算法:元素複製演算法copy。該演算法主要用於容器之間元素的拷貝,即將迭代器區間[first,last)的元素複製到由複製目標result給定的區間[result,result+(last-first))中。下面我們來看看它的函式原型:
函式原形:
template<class InputIterator, class OutputIterator> OutputIterator copy( InputIterator _First, InputIterator _Last, OutputIterator _DestBeg );
引數
- _First, _Last
- 指出被複制的元素的區間範圍[ _First,_Last).
- _DestBeg
- 指出複製到的目標區間起始位置
返回值
返回一個迭代器,指出已被複制元素區間的最後一個位置
程式示例:
首先我們來一個簡單的示例,定義一個簡單的整形陣列myints,將其所有元素複製到容器myvector中,並將陣列向左移動一位。
/******************************************************************* * Copyright (C) Jerry Jiang * * File Name : copy01.cpp * Author : Jerry Jiang * Create Time : 2012-3-20 22:44:28 * Mail :
[email protected] * Blog : http://blog.csdn.net/jerryjbiao * * Description : 簡單的程式詮釋C++ STL算法系列之十三 * 變易演算法 : 元素複製copy * ******************************************************************/ #include <iostream> #include <algorithm> #include <vector> using namespace std; int main () { int myints[] = {10, 20, 30, 40, 50, 60, 70}; vector<int> myvector; vector<int>::iterator it; myvector.resize(7); // 為容器myvector分配空間 //copy用法一: //將陣列myints中的七個元素複製到myvector容器中 copy ( myints, myints+7, myvector.begin() ); cout << "myvector contains: "; for ( it = myvector.begin(); it != myvector.end(); ++it ) { cout << " " << *it; } cout << endl; //copy用法二: //將陣列myints中的元素向左移動一位 copy(myints + 1, myints + 7, myints); cout << "myints contains: "; for ( size_t i = 0; i < 7; ++i ) { cout << " " << myints[i]; } cout << endl; return 0; }
從上例中我們看出copy演算法可以很簡單地將一個容器裡面的元素複製至另一個目標容器中,上例中程式碼特別要注意一點就是myvector.resize(7);這行程式碼,在這裡一定要先為vector分配空間,否則程式會崩,這是初學者經常犯的一個錯誤。其實copy函式最大的威力是結合標準輸入輸出迭代器的時候,我們通過下面這個示例就可以看出它的威力了。
/*******************************************************************
* Copyright (C) Jerry Jiang
*
* File Name : copy2.cpp
* Author : Jerry Jiang
* Create Time : 2012-3-20 23:25:29
* Mail : [email protected]
* Blog : http://blog.csdn.net/jerryjbiao
*
* Description : 簡單的程式詮釋C++ STL算法系列之十三
* 變易演算法 : 元素複製copy
*
******************************************************************/
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
using namespace std;
int main ()
{
typedef vector<int> IntVector;
typedef istream_iterator<int> IstreamItr;
typedef ostream_iterator<int> OstreamItr;
typedef back_insert_iterator< IntVector > BackInsItr;
IntVector myvector;
// 從標準輸入裝置讀入整數
// 直到輸入的是非整型資料為止 請輸入整數序列,按任意非數字鍵並回車結束輸入
cout << "Please input element:" << endl;
copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));
//輸出容器裡的所有元素,元素之間用空格隔開
cout << "Output : " << endl;
copy(myvector.begin(), myvector.end(), OstreamItr(cout, " "));
cout << endl;
return 0;
}
呵呵,現在知道copy的神奇所在吧,^_^
*******************************************************************************************************************************
********************************************************************************************************************************
相關推薦
簡單的程式詮釋C++ STL算法系列之十三:copy
前面十二個演算法所展現的都屬於非變易演算法(Non-mutating algorithms)系列,現在我們來看看變易演算法。所謂變易演算法(Mutating algorithms)就是一組能夠修改容器元素資料的模板函式,可進行序列資料的複製,變換等。
簡單的程式詮釋C++ STL算法系列之十:search
C++STL的非變易演算法(Non-mutating algorithms)是一組不破壞操作資料的模板函式,用來對序列資料進行逐個處理、元素查詢、子序列搜尋、統計和匹配。 search演算法函式在一個序列中搜索與另一序列匹配的子序列。它有如下兩個原型
算法系列之七:愛因斯坦的思考題(下)
CheckGroupRelation()函式需要根據當前組group的位置進行適當的處理,如果當前組是第一個組或最後一個組,則group的相鄰組只有一個,就是最靠近group的組,其它情況下group的相鄰組都是兩個。CheckGroupRelation()函式的實現如下:
算法系列之九:計算幾何與圖形學有關的幾種常用演算法(二)
3.6 用向量的叉積判斷直線段是否有交 向量叉積計算的另一個常用用途是直線段求交。求交演算法是計算機圖形學的核心演算法,也是體現速度和穩定性的重要標誌,高效並且穩定的求交演算法是任何一個CAD軟體都必需要重點關注的。求交包含兩層概念,一個是判斷是否相交,另一個是
算法系列之七:愛因斯坦的思考題(上)
這是一個很有趣的邏輯推理題,傳說是愛因斯坦提出來的,他宣稱世界上只有2%的人能解出這個題目,傳說不一定屬實,但是這個推理題還是很有意思的。題目是這樣的,據說有五個不同顏色的房間排成一排,每個房間裡分別住著一個不同國籍的人,每個人都喝一種特定品牌的飲料,抽一種特定品牌的煙,養
C++STL 算法
++ 頭文件 nbsp family 序列 容器 algorithm function UNC 算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。 <algorithm>是所有STL
C語言實現TOP K算法系列之快速排序實現
TOP K演算法的實現有很多種方式,其中類似於快排的實現是非常棒的,堆的實現也是非常好的,其中就是關於快排的實現會得到一個TOP K的集合,而這個集合不一定保證裡面的資料都是有序的。 下面就獻上TOP
【算法系列之枚舉】生理周期
pac cin 輸出 peak 給定 cout 指定 eno d+ 題目 人有體力、情商、智商的高峰日子,它們分別每隔 23天、28天和33天出現一次。對於每個人,我們想 知道何時三個高峰落在同一天。給定三個高峰出現 的日子p,e和i(不一定是第一次高峰出
算法系列之<快速排序>
quicksort n) param arr [] array code quick 成長 快速排序: /** * 快速排序 * 最好情況下:每趟把原序列分成兩個長度幾乎相等的子序列 * 最差情況下:每趟把原序列分成長度相差很大的兩個子序列
白話經典算法系列之三 希爾排序的實現
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)
圖解算法系列之選擇排序
選擇排序 (1)演算法描述 對於給定的一個線性空間,維護兩個區域——“已排序區域”和“未排序區域”。遍歷每一個元素,找出該元素後邊所有元素中,比當前元素絕對值相差最大的元素,與該元素交換位置。 (2)演算法圖解 void selectionSort(int arr[], int number);
圖解算法系列之插入排序(Low版)
(1)演算法描述 對於給定的線性空間,依次考察每個元素,當指定的元素比後一個元素大(或者小)的時候就交換位置,然後交換過來的後一個元素繼續向前比較,只要比該元素大(或者小)就兩兩交換,直到不符合交換條件或者到達最前端。 (2)演算法圖解 (3)C/C++程式碼實現 CustomSort.h
圖解算法系列之插入排序(優化版)
(1)演算法描述 對於給定的一個線性空間,遍歷考察每一個元素,將當前元素拷貝一份,並將前一個元素拷貝到當前元素的原位置。拷貝出來的元素與前一個元素進行比較,如果滿足前一個元素大於或小於當前元素就將當前拷貝出來的元素放到當前位置,否則繼續向前比較。 (2)圖解演算法 (3)C/C++程式碼實現
圖解算法系列之氣泡排序(Low版)
(1)演算法描述 對於給定的線性序列,每一個元素與其下一個元素進行比較,如果滿足大於當前元素就交換位置,然後依次向下比較。利用數學歸納法得知:N個元素總共比較N(N-1)次。 (2)圖解演算法 (3) C/C++程式碼實現 Custom.h void BubbleSort(int ar
圖解算法系列之冒泡排序(Low版)
下一個 col 歸納 .cpp vpd 如果 ber 依次 分享圖片 (1)算法描述 對於給定的線性序列,每一個元素與其下一個元素進行比較,如果滿足大於當前元素就交換位置,然後依次向下比較。利用數學歸納法得知:N個元素總共比較N(N-1)次。 (2)圖解算法 (3) C/
圖解算法系列之氣泡排序(優化版)
演算法描述 在第一層迴圈中設定一個變數,只要該序列區域性有序就不需要進行排序了,提前終止迴圈。 圖解演算法 略. C/C++程式碼實現 Custom.h void BubbleSortAdvanced(int arr[], int number); Custom.cpp v
圖解算法系列之冒泡排序(優化版)
bool 算法系列 num block 代碼 als lean 設置 復雜 算法描述 在第一層循環中設置一個變量,只要該序列局部有序就不需要進行排序了,提前終止循環。 圖解算法 略. C/C++代碼實現 Custom.h void BubbleSortAdvanced(
圖解算法系列之希爾排序
希爾排序 (1)演算法描述 對於給定的線性序列,將這個序列按照一定規則進行分組,每個小序列使用插入排序的方法排序。由於是每個分組進行排序,序列總體只是區域性有序,全域性還是無序的。因此全部的分組進行一次排序後,再將小分組劃分成更大的分組進行排序,直到只有一個分組,並且這個分組也是有序的。也就是說上面描述的
基礎算法系列之排序演算法-3. 直接插入排序 並用其解決HDU 1106 排序
我們之前已經學習了氣泡排序和二分查詢兩種基本演算法,本篇文章我們將一起學習下一個基礎演算法——直接插入排序演算法。 直接插入排序 直接插入排序,從這個名字來看,是不是讓你想到了什麼場景?!對了,就是打撲克牌的場景,我們每摸一張牌,是不是按照一定的次
基礎算法系列之排序演算法-5. 快速排序
我們之前學習了氣泡排序演算法,我們知道,在氣泡排序過程中,只對相鄰的兩個元素進行比較,因此每次交換兩個相鄰的元素時只能消除一個逆序。如果能通過兩個(不相鄰)元素的一次交換,消除多個逆序,則會大大加快排序的速度。而這就是本篇文章講述的另一種基本排序演算法——快速排序演算法。