一.队列和优先队列

队列是front,back可以访问队首队尾,优先队列用top访问优先级最高

一般优先队列重载小于号,<greater>重载大于号

#include<bits/stdc++.h>
using namespace std;
int main()
{
    queue<int> q;
    q.push(1);q.push(2);
    q=queue<int>();//队列没有clear函数,直接初始化即可清空队列
    cout<<q.empty()<<endl;
}
#include<iostream>
#include<queue>
using namespace std;
struct st{
    int x;
    int y;
    friend bool operator<(const st T1,const st T2)
    {
        return T1.x>T2.x;
    }
};
int main()
{
    priority_queue<int,vector<int>,greater<int> > qu;
    qu.push(2);qu.push(3);qu.push(5);
    while(!qu.empty())
    {
        cout<<qu.top();//235
        qu.pop();
    }
    cout<<endl;
    priority_queue<st>qq;
    st t1,t2;
    t1.x=2;t2.x=3;
    qq.push(t2);qq.push(t1);
    while(!qq.empty())
    {
          cout<<qq.top().x;//23
          qq.pop();
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
   int id;
   int val;
   friend bool operator>(const node T1,const node T2)
   {
       return T1.val>T2.val;
   }
};

int main()
{
    priority_queue<node,vector<node>,greater<node>> q;
    q.push({1,2});q.push({2,3});
    cout<<q.top().val;//2
}

 

二.栈

栈和队列一样没有clear的清空函数,需要循环pop。栈先进后出,访问栈顶的元素用top。其他操作与队列类似。

.size()可以知道元素个数

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    stack<int> s;
    s.push(2);s.push(3);s.push(4);
    cout<<s.size()<<endl;//3
    while(!s.empty())
    {
        cout<<s.top();//432
        s.pop();
    }
    return 0;
}

三.向量(动态数组)

vector可以用下标访问

二维vector的用法,当v=[[],[]]时,v.empty()==0,v[0].empty()=1;当v=[]时,v.empty()==1

vector可以用比较运算符

vector<int> a={1,2,3};
    for(auto x:a) cout<<x<<' ';
    puts("");
    vector<int> b=a;
    for(auto x:b) cout<<x<<' ';
    puts("");
    vector<int> c(4);
    for(auto x:c) cout<<x<<' ';
    puts("");
    vector<int> d(4,2);
    for(auto x:d) cout<<x<<' ';
    puts("");
    vector<int> e(a.begin(),a.begin()+2);//左闭右开
    for(auto x:e) cout<<x<<' ';
    puts("");
    int n=1,m=3;
    vector<vector<bool>> st(n,vector<bool>(m,false));
    //开创一个n*m的二维st数组

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    const int M=3,N=5;
    vector<vector<int>>v(N);
    for(int i=0;i<v.size();++i)
    {
        v[i].resize(M);
    }
    for(int i=0;i<N;++i)
    for(int j=0;j<M;++j)
    v[i][j]=i*10+j;
    v[2].erase(v[2].begin());
    v[2].erase(v[2].begin()+1);
    v[2].erase(v[2].begin());
    cout<<v.size()<<endl;//5
    cout<<v[2].size()<<endl;//0
    cout<<v[2].empty();//1
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
v.push_back(2);v.push_back(6);v.push_back(8);
cout<<v.size()<<endl;//3
cout<<v.front();cout<<v.back()<<endl;//28
reverse(v.begin(),v.end());
//v.end()是尾地址加一类似于sort
for(int i=0;i<3;++i)
cout<<v[i];//862
cout<<endl;
v.pop_back();
cout<<v.front()<<endl;//8
v.pop_back();
cout<<v.empty()<<endl;//0
v.clear();
cout<<v.empty();//1
return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> v(4,3),v2(3,4);
    //v初始是长度为4,每个元素都为3的vector
    v.push_back(5);
    for(auto x:v) cout<<x<<' ';
    //3 3 3 3 5
    cout<<endl;
    cout<<(v<v2)<<'\n';//1
    //vector支持字典序比较
    return 0;
}

 

四.集合

set是有序,互异的集合,可以在logn时间进行查找,插入,删除等操作。只能用迭代器访问,unordered_set的插查删O(1)的,rbegin()查最大值

set的insert函数返回值是pair对组型。队组的第一个成员是指向欲插入元素的迭代器,第二个成员是一布尔量,表示本次操作是否成功。

multiset的insert函数的返回值是指向所插入元素的迭代器。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    set<int> s;
    s.insert(2);s.insert(4);s.insert(3);
    auto minn=s.begin();//2
    auto maxn=s.rbegin();//4
    cout<<*minn<<' '<<*maxn;
}

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    set<int> s;
    s.insert(2);s.insert(3);s.insert(4);
    auto it=s.begin();
    for(int i=0;i<3;++i)
    cout<<*it++<<' ';
    //2 3 4
    cout<<endl;
    it=s.end();
    for(int i=0;i<3;++i)
    cout<<*--it<<' ';
    //4 3 2
}

 

#include<iostream>
#include<set>
#include<unordered_set>
#include<algorithm>
using namespace std;
int main()
{
set<int> s;//默认从小到大
multiset<int> s2;//可以重复元素
unordered_set<int> s3;//无序
s3.insert(7);s3.insert(3);s3.insert(6);
s2.insert(2);s2.insert(2);
s.insert(2);s.insert(7);s.insert(6);
cout<<*s.lower_bound(6)<<" "<<*s.upper_bound(6)<<endl;
//lower_bound(x)返回的是第一个大于等于x的迭代器
//upper_bound(x)返回的是第一个大于x的迭代器
s.erase(2);//erase的参数可以是地址,也可以是值
cout<<s.count(2)<<endl;//返回元素的个数0
cout<<s2.count(2)<<endl;//2
for(auto it=s3.begin();it!=s3.end();it++)
cout<<*it<<" ";//6 7 3
cout<<endl;
for(set<int>::iterator it=s.begin();it!=s.end();it++)
cout<<*it<<" ";//6 7
cout<<endl;
set<int,greater<int> >st;
st.insert(3);st.insert(8);st.insert(9);
for(set<int,greater<int> >::iterator it=st.begin();it!=st.end();it++)
cout<<*it<<" ";//9 8 3
st.clear();
cout<<endl<<st.empty();//1
return 0;
}

五.string

string可以用“=”“+”等运算符,可以用“>”">=""<""<=""==""!="

 当b数组未被填充时如果用下标不能直接cout<<b;若用insert(pos,n,char)注意形式

 

transform(s.begin(),s.end(),s.begin(),::tolower);
s.erase(unique(s.begin(),s.end()),s.end());
//string的小写转换和去重

 

 

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b("");
    getline(cin,a);
    int n=a.size();
    int t=0;
    for(int i=0;i<n;++i)
    {
        char c=a[i]+a[(i+1)%n];
        b.insert(t++,1,c);
    }
    cout<<b<<endl;
}
/*

#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b("");
getline(cin,a);
int n=a.size();
int t=0;
for(int i=0;i<n;++i)
{
b[i]=a[i]+a[(i+1)%n];
}
for(int i=0;i<n;++i)
cout<<b[i];
}

*/

 

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
    int a[4]={1,2,3,4};
    do
    {
      cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
    }while(next_permutation(a,a+4));//找全排列
    return 0;
}

 

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    string str("This is the world");
    string str2;
    str2 = str.substr(6, 3);
    cout << str2 << endl;
    str2 = str.substr(6);
    cout << str2 << endl;
    //str2.insert(2,"io");
    //str2.insert(2,str2);
    str2.insert(2, 3, 'i');//第三参不放字符串
    cout << str2 << endl;
    cout << str.find("is") << endl;//找第一次出现的位置
    cout << str.find("is", 4) << endl;//从4到结尾第一次出现的位置
    string str1("agbdcfe");
    sort(str1.begin(), str1.end());
    cout << str1 << endl;//abcdefg
    next_permutation(str1.begin(), str1.end());
    cout << str1 << endl;//abcdegf下一个全排列
    prev_permutation(str1.begin(), str1.end());
    cout << str1 << endl;//abcdefg上一个全排列
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str=("bupt");
    printf("%s",str.c_str());
       //用printf输出string,str.c_str()表示str的首字符地址
    return 0;
}

 

六.映射(map)

map是键值对容器,不能修改key,可以修改value,map会根据key自动排序,时间复杂度包括++,--大多都是logn

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
map<int,string> m;
map<string,vector<int>> m1;
m1["zhangsan"]=vector<int>{1,2,3,4};
cout<<m1["zhangsan"][3]<<endl;//4
m[1]="zhangsan";//map当数组用的时候时间是logn
m[2]="lisi";
m.insert({2,"wangwu"});//若键值已经存在,就不再插入
m.insert({3,"wangwu"});
for(map<int,string>::iterator it=m.begin();it!=m.end();it++)
cout<<it->first<<" "<<it->second<<endl;
m.erase(2);//erase()里放键值
cout<<m.count(2)<<endl;
return 0;
}

 七.pair和bitset

#include<bitset>
#include<iostream>
using namespace std;
int main()
{
    pair<int,string> p,q;
    p={3,"zhangsan"};
    cout<<p.first<<" "<<p.second<<endl;
    //c++99不能直接=
    q=make_pair(4,"lisi");
    cout<<q.first<<" "<<q.second<<endl;
    //pair自带比较运算
    cout<<(q>p)<<endl;//先比较第一,再比较第二
    bitset<5> a,b;
    //bitset括号里写长度
    //bitset支持所有位运算和==,!=以及[]运算符
    //支持count(),返回由多少个一
    //any()判断是否有一个一,none()判断是否全为0
    //set(),把所有数置成一,set(k,v)--将第k位变成v;
    //rset(),把所有数置成0
    a.set(3);
    a.reset(2);
    cout<<(a[2]^a[3])<<endl;//1
    cout<<a[2]<<a[3]<<endl;//01
    b.set();
    cout<<b[0]<<b[1]<<b[2];//111
    cout<<endl;cout<<b.count();//5
}

 

 八.unordered_set,unordered_map,unordered_multiset,unordered_map增删改查都为o1

 

 posted on 2022-12-26 18:37  ruoye123456  阅读(32)  评论(0)    收藏  举报