STL基礎--演算法(修改資料的演算法)
阿新 • • 發佈:2019-01-01
修改元素的演算法
- copy, move, transform, swap, fill, replace, remove
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
vector<int>::iterator itr, itr2;
pair<vector<int>::iterator, vector<int>::iterator> pair_of_itr;
1 拷貝
copy(vec.begin(), vec.end(), // Source vec2.begin()); // Destination copy_if(vec.begin(), vec.end(), // Source vec2.begin(), // Destination [](int x){ return x>80;}); // Condition // vec2: {87, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0} copy_n(vec.begin(), 4, vec2.begin()); // vec2: {9, 60, 70, 8, 0, 0, 0, 0, 0, 0, 0} copy_backward(vec.begin(), vec.end(), // Source vec2.end()); // Destination // vec2: {0, 0, 0, 0, 9, 60, 70, 8, 45, 87, 90}
2 移動
vector<string> vec = {"apple", "orange", "pear", "grape"}; // 4 items vector<string> vec2 = {"", "", "", "", "", ""}; // 6 items move(vec.begin(), vec.end(), vec2.begin()); // vec: {"", "", "", ""} // Undefined // vec2: {"apple", "orange", "pear", "grape", "", ""}; // // 如果元素型別定義了移動語義,元素會移動過去 // 否則拷貝,相當於是copy(). move_backward(vec.begin(), vec.end(), vec2.end()); // vec2: {"", "", "apple", "orange", "pear", "grape"};
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec3 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
3 轉換
transform(vec.begin(), vec.end(), // Source vec3.begin(), // Destination [](int x){ return x-1;}); // Operation transform(vec.begin(), vec.end(), // Source #1 vec2.begin(), // Source #2 vec3.begin(), // Destination [](int x, int y){ return x+y;}); // Operation // 將vec和vec2的元素相加存到vec3中 // vec3[0] = vec[0] + vec2[0] // vec3[1] = vec[1] + vec2[1] // ...
4 交換--雙向拷貝
swap_ranges(vec.begin(), vec.end(), vec2.begin());
5 填充
vector<int> vec = {0, 0, 0, 0, 0};
fill(vec.begin(), vec.end(), 9); // vec: {9, 9, 9, 9, 9}
fill_n(vec.begin(), 3, 9); // vec: {9, 9, 9, 0, 0}
generate(vec.begin(), vec.end(), rand); // 函式生成的值填充
generate_n(vec.begin(), 3, rand);
6 替換
replace(vec.begin(), vec.end(), // 替換的範圍
6, // 替換的舊值
9); // 新值
replace_if(vec.begin(), vec.end(), // 替換的範圍
[](int x){return x>80;}, // 舊值替換的條件
9); // 新值
replace_copy(vec.begin(), vec.end(), // 源
vec2.begin(), // 目的
6, // 舊值
9); // 新值
// 通用形式: replace_copy_if()
7 刪除
remove(vec.begin(), vec.end(), 3); // 刪除值
remove_if(vec.begin(), vec.end(), [](int x){return x>80;});
// 滿足條件刪除
remove_copy(vec.begin(), vec.end(), // Source
vec2.begin(), // Destination
6); // Condition
// 將剩餘的元素拷貝到vec2
// 通用形式: remove_copy_if()
unique(vec.begin(), vec.end()); // 刪除連續的相等的值
unique(vec.begin(), vec.end(), less<int>());
// 前一個元素與當前元素滿足謂詞條件的,刪除當前元素
unique_copy(vec.begin(), vec.end(), vec2.begin());
// 刪除連續重複的元素,剩餘的拷貝
// 通用形式: unique_copy()
改變順序的演算法
- reverse, rotate, permute, shuffle
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {0,0,0,0,0,0,0}; // 7 items
1 反轉
reverse(vec.begin()+1, vec.end()-1);
// vec: {9,87,45,8,70,60,90}; // 7 items
reverse_copy(vec.begin()+1, vec.end()-1, vec2.begin());
// vec2: {87,45,8,70,60,0,0};
2 旋轉
// 前面的元素依次移到最後,直到指定的元素成為第一個元素
rotate(vec.begin(), vec.begin()+3, vec.end());
// vec: {8,45,87,90,9,60,70}; // 7 items
rotate_copy(vec.begin(), vec.begin()+3, vec.end(), // Source
vec2.begin()); // Destination
// 旋轉後的結果拷貝到vec2
// vec不變
3 置換
next_permutation(vec.begin(), vec.end());
//字典序下一個排列
prev_permutation(vec.begin(), vec.end());
//字典序上一個排列
// {1,2,3,5} < {1,2,4,4}
// {1,2} < {1,2,3}
//遞增排序: {8, 9, 45, 60, 70, 87, 90}
// - 字典序最小
//
//遞減排序: {90, 87, 70, 60, 45, 9, 8}
// - 字典序最大
// 通用的版本: next_permutation(), prev_permutation()
4 打亂
//每個元素隨機選擇一個元素交換
random_shuffle(vec.begin(), vec.end());
random_shuffle(vec.begin(), vec.end(), rand);
// C++ 11
shuffle(vec.begin(), vec.end(), default_random_engine());
// 更好的隨機數發生器