(5)STL演算法之複製

2021-10-14 10:02:45 字數 4314 閱讀 6569

修改序列式演算法能對容器內容造成修改,而改變容器一般有兩種方法:

(1)使用迭代器遍歷序列的過程中,直接改變元素的值;

(2)在元素複製的過程中,改變元素的值。

能對容器內容造成改變的演算法主要包括:複製、轉換、互換、賦值、替換、逆轉、排列等 8種。

1、複製

元素複製是指在兩個容器變數之間進行元素傳遞。

(1)copy()

//  宣告及定義

template outputiterator copy (inputiterator first, inputiterator last, outputiterator result);

templateoutputiterator copy (inputiterator first, inputiterator last, outputiterator result)

return result;

}

使用示例:

#include #include #include #include using namespace std;

void print(int& ele)

void main()

; vectorv1;

v1.assign(arr, arr + 9);

cout << "vector v1: " << endl;

for_each(v1.begin(), v1.end(), print);

cout << endl;

listl1(v1.size()),l2;

cout << l1.size() << " " << l2.size() << endl;

// copy(v1.begin(), v1.end(), back_inserter(l1));//引數 3 使用到了乙個 插入迭代器

// or

copy(v1.begin(), v1.end(), l1.begin()); //使用這種形式就要預定儲存空間

cout << "list l1: " << endl;

for_each(l1.begin(), l1.end(), print);

cout << endl;

}

(2)copy_backward()

//宣告及定義

template bidirectionaliterator2 copy_backward (bidirectionaliterator1 first,bidirectionaliterator1 last,bidirectionaliterator2 result);

templatebidirectionaliterator2 copy_backward ( bidirectionaliterator1 first,bidirectionaliterator1 last,bidirectionaliterator2 result )

用法示例:

#include #include #include using namespace std;

int main() ;

vectorv(arr,arr+5); // 10 20 30 40 50

v.resize(v.size() + 3); // 重設容器大小 // 10 20 30 40 50 xx xx xx

// 從後往前 複製

copy_backward(v.begin(), v.begin()+5, v.end());// 10 20 30 10 20 30 40 50

for (int val : v)

cout << val << " ";

cout << endl;

return 0;

}

如果要把乙個區間複製到前端,應使用copy(),目標位置應該是begin();

如果要把乙個區間複製到後端,應使用copy_backward(),目標位置應該是end();

(3)copy_if()   c++11

實現有條件的複製

//宣告及定義

template outputiterator copy_if (inputiterator first, inputiterator last,outputiterator result,unarypredicate pred);

template outputiterator copy_if (inputiterator first, inputiterator last,outputiterator result,unarypredicate pred) // pred為真時 ,執行

++first;

}return result;

}

用法示例:

#include #include #include using namespace std;

bool fun(int& elem) //判斷是否大於等於 0

int main() ;

vectorv2(v1.size());

// auto it = copy_if(v1.begin(), v1.end(), v2.begin(), (int i) );

// or

auto it = copy_if(v1.begin(), v1.end(), v2.begin(), fun);

v2.resize(distance(v2.begin(), it));

cout << "vector v2:";

for (int& val : v2)

cout << ' ' << val; // 結果: 25,15,5,0

cout << endl;

return 0;

}

(4)reverse_copy()    c++11

逆轉順序並複製。

//宣告及定義

template outputiterator reverse_copy (bidirectionaliterator first,bidirectionaliterator last, outputiterator result);

template outputiterator reverse_copy (bidirectionaliterator first,bidirectionaliterator last, outputiterator result)

return result;

}

用法示例:

#include #include #include using namespace std;

int main()

; vectorv;

v.resize(9); // allocate space // 要保證目標位址有足夠空間,否則要使用insert迭代器

reverse_copy(arr, arr + 9, v.begin());

cout << "vector v:";

for (auto it = v.begin(); it != v.end(); ++it)

cout << *it<< ' ' ;

cout << endl;

return 0;

}

(5)copy_n()

template outputiterator copy_n (inputiterator first, size n, outputiterator result);

templateoutputiterator copy_n (inputiterator first, size n, outputiterator result)

return result;

}

用法示例:

#include #include #include using namespace std;

int main() ;

vectorv;

copy_n(arr, 5, back_inserter(v));

cout << "vector v:";

for (auto it = v.begin(); it != v.end(); ++it)

cout << ' ' << *it; // vector v: 10 20 30 40 50

cout << endl;

return 0;

}

C 提高程式設計 5 STL 常用演算法(查詢演算法)

5.2 常用查詢演算法 5.1 find includeusing namespace std include include include 常用查詢容器 find void test1 查詢容器中 是否有5 這個元素 vector iterator pos find v.begin v.end ...

STL演算法之複製 移動 填充 歸併 替換

轉接自stl演算法 1.copy 將乙個區間元素複製到另乙個區間 2.copy if 將滿足謂詞pred條件的元素複製到另乙個區間 3.copy backward 將區間的元素從最後乙個元素開始複製 4.copy n 複製乙個區間的n個元素到另一區間 5 move 將區間的元素移到另乙個區間 6.m...

STL演算法 06複製元素

copy 將資料從乙個容器拷貝到另乙個容器,或將資料從容器的乙個區間拷貝到另乙個區間。copy backward 拷貝時必須保證有足夠的空間。沒有copy if 演算法,可以使用remove copy if 演算法 複製過程中要逆轉元素次序,使用reverse copy 演算法 把容器內所有元素賦值...