標準庫頭文件:algorithm

1.常用操作

for_each(vec.begin(), vec.end(), [](int &n){ n++; });//將vector中的所有元素加一
for_each(vec.begin(), vec.end(), Sum());//Sum是重載operator()的類
for_each_n(vec.begin(), 3, [](auto& n){ n++; });//將vecotr第一個元素到第三個元素加一,C++17支持
count(vec.begin(), vec.end(), 3);//返回vec中3的個數
count_if(vec.begin(), vec.end(), [](int i){return i % 2 == 0;});//返回vec中偶數個數
find(vec.begin(), vec.end(), 3);//返回vec中3的位置,沒有則返回end
find_if(vec.begin(), vec.end(), [](int x){ return x>4; });//返回vec中第一個大於4的位置,沒有則返回end()
find_if_not(vec.begin(), vec.end(), [](int x){ return x>4; });//返回vec中第一個小於等於4的位置,沒有則返回end()
search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());//在vec1中搜索vec2,返回找到的位置,沒有找到則返回end()
search_n(vec.begin(), vec.end(), 2, 2);//在vec中查找2個2,返回到的位置,沒有找到則返回end()
copy(vec1.begin(), vec1.end(), vec2.begin());//將vec1拷貝到vec2的第一個元素位置,vec2要有足夠的空間,返回vec2.begin()+vec1.size()迭代器
copy_if(vec1.begin(), vec1.end(), vec2.begin(), [](int x){ return x>4; });//將vec1中大於4的元素拷貝到vec2,返回vec2.begin()+(符合條件個數)迭代器
copy_n(vec1.begin(), 4, vec2.begin());//拷貝vec1開始的前4個字符到vec2的開頭處
copy_backward(vec1.begin(), vec1.end(), vec2.end());//將vec1拷貝到vec2的最後一個元素位置,vec2要有足夠的空間,返回vec2排在最前面元素的迭代器
move(vec1.begin(), vec1.end(), vec2.begin());//將vec1拷貝到vec2的第一個元素位置,vec2要有足夠的空間,返回vec2.begin()+vec1.size()迭代器
move_backward(vec1.begin(), vec1.end(), vec2.end());//將vec1拷貝到vec2的最後一個元素位置,vec2要有足夠的空間,返回vec2排在最前面元素的迭代器
fill(vec.begin(), vec.end(), 2);//將vec的所有元素填充成2
fill(vec.begin(), 5, 2);//將vec的前5個元素填充成2
transform(str.begin(), str.end(), str.begin(), [](char c) -> char { return toupper(c); });//將str的字符變成大寫
transform(vec1.begin(), vec1.end(), vec2.begin(), [](int n) -> int { return ++n; });//將vec1中的所有元素加一,結果放在vec2中
transform(vec1.begin(), vec1.end(), vec2.begin(), vec1.begin(), [](int x, int y){ return x+y; });//vec1和vec2中對應位置的元素相加,結果存放在vec1中
remove(str1.begin(), str1.end(), ' ');//將str1中所有的空格移到末尾,並用不需要刪除的值給他們賦值
str1.erase(remove(str1.begin(), str1.end(), ' '), str1.end());//刪除str1中所有的空格
remove_if(str1.begin(), str1.end(), [](unsigned char x){return isspace(x);});//將str1中所有的空格移到末尾,並用不需要刪除的值給他們賦值
str1.erase(remove_if(str1.begin(), str1.end(), [](unsigned char x){return isspace(x);}), str1.end());//刪除所有空格,包括\t和\n
replace(vec1.begin(), vec1.end(), 2, 4);//將vector中所有2替換成4
replace_if(vec1.begin(), vec1.end(), [](int x){ return x>4; }, 4);//將vector中所有大於4的元素替換成4
reverse(vec1.begin(), vec1.end());//倒置一個vector
reverse_copy(vec1.begin(), vec1.end(), vec2.begin());//將倒置的vec1拷貝到vec2中,vec2要有足夠的空間
unique(vec.begin(), vec.end());//將排好序的vec中的重複元素移到末尾
vec.erase(unique(vec.begin(), vec.end()), vec.end());//刪除vec中的重複元素
unique_copy(vec1.begin(), vec1.end(), vec2.begin());//將vec1中非重複元素複製到vec2中
is_sorted(begin(vec), end(vec));//判斷vec有沒有按照升序排列
sort(vec.begin(), vec.end());//將vec升序排列
sort(vec.begin(), vec.end(), greater<int>());//將vec降序排列
lower_bound(vec1.begin(), vec1.end(), 6);//返回有序vecotr中第一個大於等於6的迭代器位置
upper_bound(vec1.begin(), vec1.end(), 6);//返回有序vecotr中第一個大於6的迭代器位置
binary_search(vec1.begin(), vec1.end(), 6);//在有序vector中查找6,找到返回true
pair<vector<int>::iterator, vector<int>::iterator> p = equal_range(vec1.begin(), vec1.end(), 6);//p.first是lower_bound的返回結果,p.second是upper_bound的返回結果
merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin());//將兩個有序vector合併到vec3中
includes(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());//判斷vec2是否是vec1的子集,是則返回true
set_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin());//將vec1-vec2的差集放進vec3
set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin());//將vec1和vec2的交集放進vec3
set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin());//將vec1和vec2的並集放進vec3
make_heap(vec1.begin(), vec1.end());//將vec1變成一個堆,最大元素在最前面
is_heap(vec1.begin(), vec1.end());//判斷vec1是否是一個堆
push_heap(vec1.begin(), vec1.end());//將新push_back()的元素加入堆中
pop_heap(vec1.begin(), vec1.end());//將堆頂元素彈出,沒有返回值
sort_heap(vec1.begin(), vec1.end());//將堆變成排好序的區間
max(x, y);//返回x和y中更大的值
max( { "foo", "bar", "hello" }, [](const string& s1, const string& s2) {return s1.size() < s2.size();});//返回三個字符串中長度最長的一個
max_element(vec1.begin(), vec1.end());//返回區間中的最大元素的迭代器位置
min(x, y);//返回x和y中更小的值
min( { "foo", "bar", "hello" }, [](const string& s1, const string& s2) {return s1.size() < s2.size();});//返回三個字符串中長度最短的一個
min_element(vec1.begin(), vec1.end());//返回區間中的最小元素的迭代器位置
equal(vec1.begin(), vec1.end(), vec2.begin());//判斷vec2中是否有vec1的序列,如果有返回true
clamp(x, 0, 10);//如果x在[0,10]則返回x,否則返回0或10,c++17支持

2.不常用操作

all_of(vec.cbegin(), vec.cend(), [](int i){ return i % 2 == 0; }));//vector中是否所有的元素都滿足謂詞
any_of(vec.cbegin(), vec.cend(), [](int i){ return i % 2 == 0; }));//vector中是否存在元素滿足謂詞
none_of(vec.cbegin(), vec.cend(), [](int i){ return i % 2 == 0; }));//vector中是否所有的元素都不滿足謂詞
pair<string::iterator, string::reverse_iterator> p = mismatch(str.begin(), str.end(), str.rbegin());//查找兩個範圍第一個不同元素的位置
find_end(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());//返回在vec1中最後符合vec2序列的位置,沒有則返回end()
find_first_of(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());//返回在vec1中第一個符合vec2中元素的位置,沒有則返回end()
adjacent_find(vec.begin(), vec.end());//返回vec中第一對相鄰元素相同的位置
generate(vec.begin(), vec.end(), [n = 0] () mutable { return n++; });//給vec賦值,0,1,2,3,mutable表示n是可變的
generate_n(vec.begin(), 3, [n = 0] () mutable { return n++; });//給vec賦值3個元素,0,1,2,mutable表示n是可變的
remove_copy(str1.begin(), str1.end(), str2.begin(), 'a');//將str1中除a字符之外的字符賦值到str2中,str2要有足夠的空間
remove_copy_if(str1.begin(), str1.end(), str2.begin(), [](unsigned char x){return isspace(x);});//將str1中滿足謂詞的字符賦值到str2中,str2要有足夠的空間
replace_copy(vec1.begin(), vec1.end(), vec2.begin(), 2, 4);//將vec1的元素複製到vec2中,並且把所有的2替換成4
replace_copy_if(vec1.begin(), vec1.end(), vec2.begin(), [](int x){ return x>4; }, 4);//將vec1的元素複製到vec2中,並且把所有的大於4的元素替換成4
swap(str1, str2);//交換兩個string,可以交換pair,tuple,vector,list,deque,map,set等等
rotate(vec1.begin(), vec1.begin()+2, vec1.end());//將vec1開始的前兩個元素移到vec1的末尾
rotate_copy(vec1.begin(), vec1.begin()+2, vec1.end(), vec2.begin());//將vec1開始的前兩個元素移到vec1的末尾,複製到vec2中
random_shuffle(vec.begin(), vec.end());//隨機打亂vec
shuffle(vec.begin(), vec.end(), g);//用指定算法打亂vec,random_device rd; mt19937 g(rd());
pair<int, int> p = minmax(x, y);//返回x,y中的更小和更大值
pair<vector<int>::iterator, vector<int>::iterator> p = minmax_element(vec1.begin(), vec1.end());//返回區間中的最小值和最大值的迭代器pair

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章