STL容器

queue

遵循先进先出原则

#include<queue>
queue<int> q;
q.push(x);入队,将x 接到队列的末端。
q.pop();出队, 弹出队列的第一个元素,没有返回值
q.front()返回队首元素
q.back()返回队尾元素
q.empty()判断队列空,当队列空时,返回true。
q.size()访问队列中的元素个数

stack

遵循先进后出原则

#include<stack>
stack<int> s;
s.empty() 堆栈为空则返回真
s.pop() 移除栈顶元素
s.push() 在栈顶增加元素
s.size() 返回栈中元素数目
s.top() 返回栈顶元素

vector

#include<vector>

定义

vector<int>a(10);定义具有10个整型元素的向量
vector<int>a(10,1);定义具有10个整型元素的向量,初值为1
vector<int>a(b); 拷贝b
vector<int>a(b.begin(),b.begin+3); 拷贝b到b+3

int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7;数组拷贝

添加

v.push_back(i);在最后添加i
v.insert(v.begin()+1,5);在v[1]后插入5
v.insert(v.begin(),n,m);在v[0]后插入n个m
v.insert(v.begin(),str,str+len);在v[0]后加入一个长为len的str[]

v.assign(v1.begin(),v1.end())相当于拷贝函数,把first到last的值赋值给调用者
v.assign(10,1)101赋值给v

删除

v.pop_back(); 删除a向量的最后一个元素
v.erase(v.begin()+1,v.begin()+3);删除从a[1]到a[2]

其他

v.back();返回a的最后一个元素
v.front();返回a的第一个元素
v[i]; 返回a的第i元素
v.clear(); 清空a中的元素
v.empty(); 判断a是否为空,空则返回true,非空则返回false
v.swap(b);b为向量,将a中的元素和b中的元素整体交换
v.size();返回a中元素的个数

算法

 #include<algorithm>
 sort(v.begin(),v.end());小到大排列
 reverse(v.begin(),v.end()); 元素倒置
 copy(v.begin(),v.end(),b.begin()+1);
 //复制,v.begin()到v.end()复制到,b.begin()+1到*
  find(v.begin(),v.end(),10);返回其在向量中的位置

set

begin()–返回指向第一个元素的迭代器
clear()–清除所有元素
count()–返回某个值元素的个数
empty()–如果集合为空,返回true
end()–返回指向最后一个元素的下一个位置;
equal_range()–返回集合中与给定值相等的上下限的两个迭代器
erase()–删除集合中的元素
find()–返回一个指向被查找到元素的迭代器
get_allocator()–返回集合的分配器
insert()–在集合中插入元素
lower_bound()–返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()–返回一个用于元素间值比较的函数
max_size()–返回集合能容纳的元素的最大限值
rbegin()–返回指向集合中最后一个元素的反向迭代器
rend()–返回指向集合中第一个元素的反向迭代器
size()–集合中元素的数目
swap()–交换两个集合变量
upper_bound()–返回大于某个值元素的迭代器
value_comp()–返回一个用于比较元素间的值的函数加粗样式
//A交B=RIntersec
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(RIntersec,RIntersec.begin()));
//A并B=RUnion
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(RUnion,RUnion.begin()));
//A差B=RDiff1
set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(RDiff1,RDiff1.begin()));

map

pair类型

pair<T1, T2> p; 定义了一个空的pair对象p
pair<T1, T2> p(v1, v2); 定义了包含初始值为v1和v2的pair对象p
make_pair(v1, v2) 以v1和v2值创建的一个新的pair对象

#include <stdio.h>
#include <string.h>
#include <string>
#include <utility>
using namespace std;

int main(){
        pair<int, string> p1(0, "Hello");
        printf("%d, %s\n", p1.first, p1.second.c_str());
        pair<int, string> p2 = make_pair(1, "World");
        printf("%d, %s\n", p2.first, p2.second.c_str());
        return 0;
}

#include<map>

定义

map<k, v> m;       定义了一个名为m的空的map对象
map<k, v> m(m2);   创建了m2的副本m
map<k, v> m(b, e); 创建了map对象m,并且存储迭代器b和e范围内的所有元素的副本

插入

e一个value_type类型的值。
m.insert(make_pair(1, 1));
m[1] = 1
beg和end标记的是迭代器的开始和结束
m.insert(e)
//m.insert(make_pair(1,1))
m.insert(beg, end)
m.insert(iter, e)
m[k]=v

查找和读取

m[k]          返回k对应的值 
m.find(k)     返回k对应的值
m.count(k)    返回的是k出现的次数

删除

m.erase(k)     删除的是m中键为k的元素,返回的是删除的元素的个数
m.erase(p)     删除的是迭代器p指向的元素,返回的是void
m.erase(b, e)  删除的是迭代器b和迭代器e范围内的元素,返回void

遍历

map<int, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++){
        printf("%d->%d\n", it->first, it->second);
}

排序

看了很多方法,在时间复杂度允许的情况下,用vector<pari<int,int> >复制map<int,int>最方便易懂,学map必学pair,map这里不能直接使用map是因为map不是线性存储。

#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<utility>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b){
    if(a.second==b.second){
        return a.first > b.first;
    }
    return a.second > b.second;
}
int main(){
    int n, k, f;
    cin >> n;
    map<int,int> m;
    for(int i = 0; i < n; i++){
        cin >> k;
        for(int j = 0; j < k; j++){
            cin >> f;
            if(m.count(f)!=0){
                m[f]++;
            }else{
                m[f] = 1;
            }
        }
    }
    vector<pair<int,int> > v;
    vector<pair<int,int> >::iterator itv;
    map<int, int>::iterator itm;

    for(itm = m.begin(); itm != m.end(); itm++){
        pair<int, int> p(itm->first,itm->second);
        v.push_back(p);
    }
    sort(v.begin(),v.end(),cmp);
    for(itv = v.begin(); itv != v.end(); itv++){
        pair<int,int> p = *itv;
        /*这里把p换成*itv编译报错,不知道为什么,
        *可能是需要强制类型转换,用v[i]类似数组方式遍历也可
        */
        cout << p.first << " " << p.second << endl;
    }
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值