STL函数总结,用到不熟悉的再总结吧
algorithm lower_bound(): 头文件: #include<algorithm>
函数模板: 如 binary_search()
函数功能: 函数lower_bound()
在first和last中的前闭后开 区间进行二分查找,返回大于或等于val的第一个元素 位置。如果所有元素都小于val,则返回last 的位置
举例如下:
一个数组number序列为:4,10,11,30,69,70,96,100.
设要插入数字3,9,111.pos
为要插入的位置的下标
则
pos = lower_bound( number, number + 8, 3) -number,pos = 0.
即numbe
数组的下标为0的位置。
pos = lower_bound( number, number + 8, 9) -number, pos = 1
,即number
数组的下标为1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111)- number, pos = 8
,即number
数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。
所以,要记住:函数lower_bound()
在first
和last
中的前闭后开 区间进行二分查找,返回大于或等于val的第一个元素 位置。如果所有元素都小于val,则返回last 的位置,且last的位置是越界的!!~
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置
upper_bound(): 头文件:#include<algorithm>
函数模板: 如binary_search()
函数功能:函数upper_bound()
返回的在前闭后开区间查找的关键字的上界,返回大于val 的第一个元素位置
例如:一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:数组下标越界)
返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置
注意:
lower_bound(val)
:返回容器中第一个值【大于或等于】val的元素的iterator位置。
upper_bound(val)
: 返回容器中第一个值【大于】val的元素的iterator位置。
lower的意义是对于给定的已经排好序的a,key最早 能插入到那个位置
0 1 | 2 2 3 所以2最早 插入到2号位置
upper的意义是对于给定的已经排好序的a,key最晚 能插入到那个位置
0 1 2 2 | 3 所以2最晚 插入到4号位置
binary_search() 查找某个元素是否出现(二分法查找)binary_search(a,a+n,number)
fill(): 和sort差不多,fill(a,a+n,number)给数组||容器赋值number
max_element() & min_element(): 这个的话还是蛮好用的,比自己一个循环写下来要快的多了,简单用法如下:
1 position=max_element(a,a+n)-a;
这样写的话就代表的是找到的最大元素的位置在哪里,position代表位置, 值得注意的一点是这个返回的是最大元素的位置,即指针指向第一个最大元素我们用以下方式表示找到的最大元素的值
1 printf ("%d\n" ,*max_element(a,a+n));
同时 min_element的用法同上,但是都有一个共同点,就是找到的位置都是第一个最大(小)的元素,即存在多个相同大小的元素的时候找到的是第一个.
min(),max() 最大最小
swap() swap(a,b)
交换
reverse() 反转reverse(v.begin(), v.end()); reverse(a,a+n)
sort(),stable_sort() sort(v1.begin(), v1.end(), cmp);
//不稳定排序stable_sort(v1.begin(), v1.end(), cmp);
//稳定排序
find() find函数主要实现的是在容器内(数组也可以)查找指定的元素,并且这个元素必须是基本数据类型的。 查找成功返回一个指向指定元素的迭代器,查找失败返回end迭代器。
还有一个find_if()函数。
search() iter = search(v1.begin(), v1.end(), v2.begin(), v2.end());
//在v1中查找是否有区间包含v2,若没找到,返回v1.end()
用于在序列 A 中查找序列 B 第一次出现的位置。
迭代器 1 2 3 4 5 6 7 8 9 10 11 begin () / end (); rbegin() / rend(); cbegin() / cend(); crbegin() / crend(); for (auto v:vec); for (auto & v:vec); iter = set1.erase(iter);
string 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <string> string s1 ("hello" ) ; string s1 = "hello" ;string s1 (4 , '=' ) ; string s1 (s2, 0 , s2.size ()) ; s1.clear (); s1.size (); s1.length(); s1.empty(); s1.c_str(); s1.substr(0 , s1.size ()); s1.append(s2, 0 , s2.size ()); to_string(100 ); stoi("100" ); stod("0.1" );
vector 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <vector> vector <int > v1 = v2; vector <int > v1 = {0 ,1 ,2 ,3 }; vector <int > v1 (v2.begin (), v2.end ()) ; vector <int > v1 (7 ) ; vector <int > v1 (7 , 3 ) vector <int > v1 (r, vector <int >(c, 0 )) v1.clear(); //清空 v1.size (); v1.empty(); v1.front(); v1.back(); v1.push_back(100 ); v1.pop_back(); iter = v1.insert(v1.begin (), 100 ); iter = v1.insert(v1.begin (), v2.begin (), v2.end ()); iter = v1.erase(v1.begin ()+2 ); iter = v1.erase(v1.begin ()+2 , v1.begin ()+5 );
stack 1 2 3 4 5 6 7 8 9 10 #include <stack> s1.clear (); s1.size (); s1.empty(); s1.top(); s1.push(100 ); s1.pop();
queue/deque 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <queue> #include <deque> q1.clear (); q1.size (); q1.empty(); q1.front(); q1.back(); q1.push_front(100 ); q1.push_back(100 ); q1.pop_front(); q1.pop_back();
优先级队列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <queue> priority_queue<int , vector <int >, less<int >> maxQ; priority_queue<int , vector <int >, greater<int >> minQ; priority_queue<int > q1 (less<int >(), v1) ; q1.clear (); q1.size (); q1.empty(); q1.top(); q1.push(100 ); q1.pop(); struct CompLess { bool operator () (const int a, const int b) { return a < b; } }; #include <algorithm> std ::make_heap(v.begin (), v.end (), comp); v.push_back(6 ); std ::push_heap(v.begin (), v.end ()); std ::pop_heap(v.begin (), v.end (), comp); v.pop_back()
pair 1 2 3 4 5 6 7 #include <utility> pair<int, string> p1(1, "Tom"); //生成一个pair pair<int , string >(1 , "Tom" ); pair(1 , "Tom" ); make_pair(1 , "Tom" ); p1.first; p1.second;
set/multiset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <set> #include <multiset> set<int, less<int>> c1(c2); //深拷贝构造 set<int, less<int>> c1(c2.begin(), c2.end()); set<int, less<int>> c1(c2.begin(), c2.end(), comp); //迭代器返回的元素依次排序 c1.clear (); c1.size (); c1.empty(); c1.count(elem); c1.find (elem); c1.lower_bound(elem); c1.upper_bound(elem); c1.insert(elem); c1.insert(c2.begin (), c2.end ()); c1.erase(elem); c1.erase(iter); c1.erase(c1.begin ()+2 , c1.begin ()+5 );
unordered_set/unordered_multiset 1 2 3 4 5 6 #include <unordered_set>
map/multimap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <map> map <int , string > m1 = {{2015 , "Tom" }, {2016 , "Jim" }}; m1.clear (); m1.size (); m1.empty(); m1.at[2015 ] = "Tom" ; m1[2015 ] = "Tom" ; m1.count(key); iter = m1.find (key); c1.lower_bound(key); c1.upper_bound(key); m1.insert(make_pair(2015 , "Tom" )); m1.insert(pair<int , string >(2015 , "Tom" )); m1.insert({2015 , "Tom" }); m1.erase(key); m1.erase(iter); m1.erase(m1.begin ()+2 , m1.begin ()+5 );
unordered_map/unordered_multimap 1 2 3 4 5 6 #include <unordered_map>
list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 list <int > l1 = l2; list <int > l1 = {0 ,1 ,2 ,3 }; list <int > l1 (l2.begin (), l2.end ()) ; list <int > l1 (7 ) ; list <int > l1 (7 , 3 ) l1.clear(); //清空 l1.size (); l1.empty(); l1.front(); l1.back(); l1.push_back(100 ); l1.pop_back(); iter = l1.insert(l1.begin (), 100 ); iter = l1.insert(l1.begin (), l2.begin (), l2.end ()); iter = l1.erase(l1.begin ()+2 ); iter = l1.erase(l1.begin ()+2 , l1.begin ()+5 );
基础输入输出 1 2 3 4 5 6 7 8 # include <string> std ::string str;std ::getline(std ::cin , str); std ::getline(std ::cin , str, ' ' );
匿名函数 1 2 3 4 sort(v.begin (), v.end (), [](const int & a, const int & b) { return a < b; });