STL的个人总结
algorithm库函数
1.reverse 翻转
(a.begin(),a.end()) reverse(a,a+n)
举个栗子
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int>a({1,2,3,4,5});
reverse(a.begin(),a.end());
for(auto x:a) cout << x <<' ';
return 0;
}
2.unique 去重
需要保证相同元素在一起才行,个人建议先sort
m=unique(begin,end)-begin //m为不重复的个数
或者a.erase(unique(begin,end),end)
举个栗子
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int>a({1,2,2,3,3,4,4,4});//vector赋初值时不要等号
int m=unique(a.begin(),a.end())-a.begin();
cout << m <<endl;
for(int i=0;i<m;i++) cout << a[i]<<' ';
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int>a({1,2,2,3,3,4,4,4});//vector赋初值时不要等号
a.erase(unique(a.begin(),a.end()),a.end());
for(auto x:a) cout << x <<' ';
return 0;
}
3.random_shuffle 随机打乱
用法同reverse
注:可通过更改随机种子,让随机数变得不同
include <ctime>
scand(time(0));
4.sort 排序
默认从小到大排序
如果需要从大到小排序,那么可以加个greater<int>()
或者自写cmp函数
举个栗子
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
vector<int>a({1,3,2,5,2});
sort(a.begin(),a.end(),greater<int>());
for(auto x:a) cout << x <<' ';
return 0;
}
给结构体排序:
1.重载小于号
struct Rec
{
int x,y;
bool operator<(const Rec &t)const
{
return x<t.x;//t是什么?例如a[0]与a[1]比较,t就是a[1]
}a[N];
}
2.cmp函数
bool cmp(Rec a, Rec b)
{
return a.x < b.x;
}
5.lower_bound/upper_bound 二分,区别在于后者无等于
int *p=lower_bound(begin,end,a);//*p为大于等于a的第一个元素
int t=lower_bound(begin,end,a)-begin;//*p为大于等于a的第一个元素的下标
其它注意:queue不能随机遍历
最后:部分例题
68. 0到n-1中缺失的数字
class Solution {
public:
int getMissingNumber(vector<int>& nums) {
unordered_set<int> S;
//将所有可能的数字都放进哈希表
for(int i=0;i<=nums.size();i++) S.insert(i);
//将已有的删掉,剩下的那个数字就是需要补充的
for(auto x:nums) S.erase(x);
return *S.begin();
}
};
32. 调整数组顺序使奇数位于偶数前面
class Solution {
public:
void reOrderArray(vector<int> &array) {
/*思路:让i指针遍历的都为奇数,j指针遍历的都为偶数
i:若为奇数那么就一直往后走;j:若为偶数那么就一直往前走
当两个奇数都不能走的时候就说明i指向偶数,j指向奇数,此时交换两个指针
这个过程一直到i与j相遇或者错开时停下
*/
int i = 0, j = array.size() - 1;
while(i < j)
{
while(i < j && array[i] % 2) i++;
while(i < j && array[j] % 2 == 0) j--;
if(i < j) swap(array[i], array[j]);
}
}
};
17. 从尾到头打印链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
vector<int>res;
for(auto p = head; p; p = p->next) res.push_back(p->val);
reverse(res.begin(), res.end());
return res;
}
};
20. 用两个栈实现队列
/*例如搬书,自己手上有几十本书,需要将最底下那本抽出来。
于是,我们可以找个工具人,将除了最底下的那本都一本一本甩给他。
最后抽出那本书后,再让他把他手上的书按顺序给我。
*/
class MyQueue {
public:
/** Initialize your data structure here. */
stack<int> s1, s2;
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
s1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
while(s1.size()>1) s2.push(s1.top()),s1.pop();//把书都甩给工具人,自己只拿一本书
int t = s1.top();
s1.pop();
while(s2.size()) s1.push(s2.top()),s2.pop();//那本书被取出来了,让工具人把书还给我,不需要他了,赶他下线
return t;
}
/** Get the front element. */
int peek() {
while(s1.size()>1) s2.push(s1.top()),s1.pop();//把书都甩给工具人,自己只拿一本书
int t = s1.top();
while(s2.size()) s1.push(s2.top()),s2.pop();//那本书被取出来了,让工具人把书还给我,不需要他了,赶他下线
return t;
}
/** Returns whether the queue is empty. */
bool empty() {
return s1.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* bool param_4 = obj.empty();
*/
53. 最小的k个数
class Solution {
public:
vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
sort(input.begin(), input.end());
vector<int>res;
for (int i = 0; i < k; i ++ ) res.push_back(input[i]);
return res;
}
};
75. 和为S的两个数字
/*在哈希表查看有没有可以凑成一对的那个数字*/
class Solution {
public:
vector<int> findNumbersWithSum(vector<int>& nums, int target) {
unordered_set<int>S;
for(auto x:nums)
{
if(S.count(target-x)) return {x,target-x};//用count函数
S.insert(x);
}
}
};
51. 数字排列
class Solution {
public:
vector<vector<int>> permutation(vector<int>& nums) {
//先排序之后才能使用next_permutation(begin,end)
sort(nums.begin(),nums.end());
vector<vector<int>>res;
do{
res.push_back(nums);
}while(next_permutation(nums.begin(),nums.end()));
return res;
}
};
26. 二进制中1的个数
class Solution {
public:
int NumberOf1(int n) {
int res = 0;
for (int i = 0; i < 32; i++)
if (n >> i & 1)
res++;
return res;
}
};
862. 三元组排序
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
struct Data
{
int x;
double y;
string z;
bool operator< (const Data &t) const
{
return x < t.x;
}
}a[N];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i].x >>a[i].y >> a[i].z;
sort(a, a+n);
//printf输出字符串需要加.c_str())
for (int i = 0; i < n; i ++ ) printf("%d %.2lf %s\n",a[i].x,a[i].y,a[i].z.c_str());
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘宇的个人网站!
评论
ValineDisqus