1. 程式人生 > >C++ STL演算法之:copy

C++ STL演算法之:copy

       前面十二個演算法所展現的都屬於非變易演算法(Non-mutating algorithms)系列,現在我們來看看變易演算法。所謂變易演算法(Mutating algorithms)就是一組能夠修改容器元素資料的模板函式,可進行序列資料的複製,變換等。

       我們現在來看看第一個變易演算法:元素複製演算法copy。該演算法主要用於容器之間元素的拷貝,即將迭代器區間[first,last)的元素複製到由複製目標result給定的區間[result,result+(last-first))中。下面我們來看看它的函式原型:

函式原形:

  1. template<class InputIterator, 
    class OutputIterator>  
  2.    OutputIterator copy(  
  3.       InputIterator _First,   
  4.       InputIterator _Last,   
  5.       OutputIterator _DestBeg  
  6.    );  

引數

_First, _Last
指出被複制的元素的區間範圍[ _First,_Last).
_DestBeg 
指出複製到的目標區間起始位置

返回值

返回一個迭代器,指出已被複制元素區間的最後一個位置

程式示例:

首先我們來一個簡單的示例,定義一個簡單的整形陣列myints,將其所有元素複製到容器myvector中,並將陣列向左移動一位。

  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy01.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-20 22:44:28 
  7.  * Mail        : [email protected] 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao 
     
  9.  *                
  10.  * Description :  簡單的程式詮釋C++ STL算法系列之十三                  
  11.  *                變易演算法 : 元素複製copy   
  12.  *                
  13.  ******************************************************************/
  14. #include <iostream>
  15. #include <algorithm>
  16. #include <vector>
  17. usingnamespace std;  
  18. int main ()   
  19. {  
  20.     int myints[] = {10, 20, 30, 40, 50, 60, 70};  
  21.     vector<int> myvector;  
  22.     vector<int>::iterator it;  
  23.     myvector.resize(7);   // 為容器myvector分配空間
  24.     //copy用法一:
  25.     //將陣列myints中的七個元素複製到myvector容器中
  26.     copy ( myints, myints+7, myvector.begin() );  
  27.     cout << "myvector contains: ";  
  28.     for ( it = myvector.begin();  it != myvector.end();  ++it )  
  29.     {  
  30.         cout << " " << *it;  
  31.     }  
  32.     cout << endl;  
  33.     //copy用法二:
  34.     //將陣列myints中的元素向左移動一位
  35.     copy(myints + 1, myints + 7, myints);  
  36.     cout << "myints contains: ";  
  37.     for ( size_t i = 0; i < 7; ++i )  
  38.     {  
  39.         cout << " " << myints[i];  
  40.     }  
  41.     cout << endl;  
  42.     return 0;  
  43. }  

從上例中我們看出copy演算法可以很簡單地將一個容器裡面的元素複製至另一個目標容器中,上例中程式碼特別要注意一點就是myvector.resize(7);這行程式碼,在這裡一定要先為vector分配空間,否則程式會崩,這是初學者經常犯的一個錯誤。其實copy函式最大的威力是結合標準輸入輸出迭代器的時候,我們通過下面這個示例就可以看出它的威力了。

  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy2.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-20 23:25:29 
  7.  * Mail        : [email protected] 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description :  簡單的程式詮釋C++ STL算法系列之十三                  
  11.  *                變易演算法 : 元素複製copy   
  12.  *                
  13.  ******************************************************************/
  14. #include <iostream>
  15. #include <algorithm>
  16. #include <vector>
  17. #include <iterator>
  18. #include <string>
  19. usingnamespace std;  
  20. int main ()   
  21. {  
  22.      typedef vector<int> IntVector;  
  23.      typedef istream_iterator<int> IstreamItr;  
  24.      typedef ostream_iterator<int> OstreamItr;  
  25.      typedef back_insert_iterator< IntVector > BackInsItr;  
  26.      IntVector myvector;  
  27.      // 從標準輸入裝置讀入整數
  28.      // 直到輸入的是非整型資料為止 請輸入整數序列,按任意非數字鍵並回車結束輸入
  29.      cout << "Please input element:" << endl;  
  30.      copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));  
  31.      //輸出容器裡的所有元素,元素之間用空格隔開
  32.      cout << "Output : " << endl;  
  33.      copy(myvector.begin(), myvector.end(), OstreamItr(cout, " "));   
  34.      cout << endl;  
  35.     return 0;  
  36. }  
轉自:   http://blog.csdn.net/jerryjbiao/article/details/7376088

相關推薦

C++ STL演算法copy

       前面十二個演算法所展現的都屬於非變易演算法(Non-mutating algorithms)系列,現在我們來看看變易演算法。所謂變易演算法(Mutating algorithms)就是一組能夠修改容器元素資料的模板函式,可進行序列資料的複製,變換等。        我們現在來看看第一個變易演算

c++ 標準模板庫 STL 演算法 for_each 函式的使用用法詳解

std::for_each template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Functi

C++ STL 容器棧的使用

http fff bsp 結果 sta 文件 demo pac 換行 Stack 棧是種先進後出的容器,C++中使用STL容器Stack<T> 完美封裝了棧的常用功能。 下面來個demo 學習下使用棧的使用。 1 //引入IO流頭文件 2 #incl

c++ STL 映射map

char 意義 out 字典序排序 IT 清空 平衡 push_back sample Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由於這個特性,它完成有可能在我們

【校招面試 C/C++】第20題 C++ STL(二)Vector

小時 可用 修改 ret cap push sta enc 指向 1、vector的動態增長   當添加元素時,如果vector空間大小不足,則會以原大小的兩倍另外配置一塊較大的新空間,然後將原空間內容拷貝過來,在新空間的內容末尾添加元素,並釋放原空間。vector的空間動

C#設計模式備忘錄模式

備忘錄模式(Memento) 在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態 UML 程式碼 class Mem

C#設計模式命令模式

命令模式Command 將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷操作。 UML 程式碼 abstract class Command

C++ STL學習 空間配置器(allocator)

標籤(空格分隔): C++ STL 眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空

機器學習演算法決策樹 (decision trees)

> By joey周琦 概述 線性模型一般variance小,bias大;而樹模型一般variance大,bias小 決策樹的優點:具有可讀性,分類速度快 一般包含三個步驟: 特徵選擇 決策樹生成 剪枝

機器學習演算法 邏輯迴歸 logistic regression (LR)

by joey周琦 LR介紹 邏輯迴歸屬於probabilistic discriminative model這一類的分類演算法 probabilistic discriminative mode這類演算法的思路如下: - 直接建模 P(Ck|x)

機器學習演算法分類演算法概述

By joey周琦 常見的分類演算法大致可以分為三類: 直接給一個discriminant function,直接確定輸入feature x的屬於哪一類。這類演算法有SVM probabilistic discriminative model.該類方法直接給P(C

常用演算法1、最小二乘法(1)

深度學習發展到如今的地位,離不開下面這 6 段程式碼。本文介紹了這些程式碼的創作者及其完成這些突破性成就的故事背景。每個故事都有簡單的程式碼示例,讀者們可以在 FloydHub 和 GitHub 找到相關程式碼。 最小二乘法 所有的深度學習演算法都始於下面這個數學公式(

c++ STL容器棧stack

Stack簡介C++ Stack(堆疊) 是一個容器類的改編,為程式設計師提供了堆疊的全部功能,——也就是說實現了一個先進後出(FILO)的資料結構。Stack初始化stack<int>  s;通過s.push() 為棧賦值,如s.push(1);stack常用函

C進階記憶體對齊

什麼是記憶體對齊?  記憶體對齊可以用一句話來概括:  “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上”。例如int型別佔用4個位元組,地址只能在0,4,8等位置上。  不同型別的資料在記憶體中按照一定的規則排列,而不一定是順序的一個接一個的排列,這就是所謂的

STL演算法heap演算法,已排序區間演算法

// 1. sort() 將區間元素以謂詞方式排序 // 2. stable_sort() sort()並保持區間元素的穩定性 // 3. partial_sort() 以謂詞找到前[beg,mid) // 4. partial_sort_copy() 將

機器學習演算法指數族分佈與廣義線性模型

> 翻譯總結By joey周琦 參考NG的lecture note1 part3 本文將首先簡單介紹指數族分佈,然後介紹一下廣義線性模型(generalized linear model, GLM), 最後解釋了為什麼邏輯迴歸(logistic r

c++ STL學習stack堆疊總結

一、標頭檔案 # include<stack> 二、定義 堆疊是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂,另一端稱為棧底。堆疊的元素插入稱為入棧,元素的刪除則為出棧。 堆疊

C++排序演算法歸併排序

程式碼實現如下#include <iostream> #include <vector> #include <algorithm> using namespace std; /*該函式將陣列下標範圍[l1,r1]和[l2,r2]的有序序列合併成一個有序序列*/ void

C++ STL模板queue佇列的用法】

#include <iostream> #include <queue> #include <assert.h> /* 呼叫的時候要有標頭檔案: #incl

C語言演算法將十進位制數轉換成二進位制數

導語:在C語言中沒有將其他進位制的數直接輸出為二進位制數的工具或方法,輸出為八進位制數可以用%o,輸出為十六進位制可以用%x,輸出為二進位制就要我們自行解決了。下面給大家講述一下如何程式設計實現將十進位制數轉換成二進位制數。 先將原始碼展示給大家: #include