讲解STL

Posted Keep--Silent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲解STL相关的知识,希望对你有一定的参考价值。

介绍一些实用的STL容器, 容器用于存储数据。
想要掌握STL,应该在平常做题过程中多用容器。
容器遍历需掌握autoiterator

基础

queue

队列,FIFO(先进先出)

    int x, y, n;
    queue<int> q;
    q.push(12);
    q.push(13);
    printf("size=%d\\n",q.size());
    printf("q.front()=%d\\n",q.front());//取front不改变队列
    printf("size=%d\\n",q.size());
    q.pop();
    printf("size=%d\\n",q.size());

stack

栈, FILO(先进后出)

stack<int> s;
q.push(12); 
q.push(13); 
x=q.top();//x=13,取top不改变队列
q.pop();
y=q.top();//y=12
n=q.size();//n=1;

string

字符串

    char ss[1000];
    string s;
    cin >> s;
    scanf("%s", ss);
    s = ss;
    for (int i = 0; i < s.size(); i++)
    {
        printf("%c", s[i]);
    }
    printf("%s\\n", s.c_str());//%s是输出字符数组,字符串要当成字符数组输出,需要c_str()
    cout << s << endl;
    cout << s.c_str() << endl;
    //
    string str1("CAB");
    unsigned int loc = str1.find("B", 0);//find,查找,重点
    if (loc != string::npos)
        cout << "Found B at " << loc << endl;
    else
        cout << "Didn't find B" << endl;
    string t1 = "123", t2 = "assdh";
    char ch = ')';
    s = t1 + t2;//字符串与字符串相加,字符串与字符相加,是拼接行为
    s = s + ch;
    cout<<s<<endl;
//s.erase()
//s.insert()
//s.replace()

例题
说明:strings之间大小的比较是按照字典序规则

priority_queue

优先队列,不细讲
点击跳转

vector

向量

vector<int>v;
int x,n=0;
for(int i=0;i<v.size();i++){
	printf("%d ",v[i]);
}
for(auto it :v){
	printf("%d ",it);
}
for(vector<int>::iterator it =v.begin();it!=v.end();it++){
	printf("%d ",*it);
}
//v.insert()
//v.erase()

说明:vectors之间大小的比较是按照词典规则

set

集合(Set)是一种包含已排序对象的关联容器

set<int>s;
s.insert(1);
s.insert(1);
s.insert(2);
int n=s.size();
for(auto it :s){
	printf("%d ",it);
}
for(set<int>::iterator it =s.begin();it!=s.end();it++){
	printf("%d ",*it);
}

例题

class Solution
{
public:
    int distributeCandies(vector<int> &candies)
    {
        set<int> s;
        for (auto x : candies)
            s.insert(x);
        return min(candies.size() / 2, s.size());
    }
};

map

C++ Maps是一种关联式容器,包含“关键字/值”对
key->value;

    map<string, string> q;
    q["ZhouSanJin"] = "ZhanShen";//注意,直接访问未存的结点会创建该结点
    printf("%s\\n", q["ZhouSanJin"].c_str());
    printf("%d\\n", q.size());
    printf("%s\\n", q["JingJing"].c_str());
    printf("%d\\n", q.size());
    if (q.find("ZhangChi") == q.end())
        printf("NoFound\\n");
    else
        printf("Found\\n");
    printf("%d\\n", q.size());
    for (auto it : q)
    {
        printf("%s:%s\\n", it.first.c_str(), it.second.c_str());
    }
    for (map<string, string>::iterator it = q.begin(); it != q.end(); it++)
    {
        printf("%s:%s\\n", it->first.c_str(), it->second.c_str());
        printf("%s:%s\\n", (*it).first.c_str(), q[(*it).first].c_str());
    }

例题

#include <bits/stdc++.h>
using namespace std;
char ss1[1000];
char ss2[1000];
int main()
{
    //key->value
    //value=q[key]
    string s;
    map<string, int> cnt; //key发言了cnt[key]次
    map<string, int> pot; //key第一次说话在pot[key]
    int n, i;
    cin >> n;
    getchar();
    string ans;
    for (int i = 0; i < n; i++)
    {
        scanf("%[^':']s", ss1);
        scanf("%[^'\\n']s", ss2);
        getchar();
        s = ss1;
        if (pot.find(s) == pot.end())
        {
            pot[s] = i + 1;
        }
        cnt[s]++;
        if (cnt[ans] < cnt[s])
            ans = s;
        else if (cnt[ans] == cnt[s])
        {
            if (pot[ans] < pot[s])
                ans = s;
        }
    }
    cout << ans << endl;
    
    return 0;
}

进阶

学会STL容器之间的合用

map_vector,vector_vector

map< vector, >
vector< vector >

void prinf(vector<vector<int>> v){
    for (auto it : v)
    {
        for(int i=0;i<it.size();i++){
            printf("%d ",it[i]);
        }
        cout<<endl;
    }
    cout<<endl;
}
    vector<vector<int>> v(2, vector<int>(2, 0));
    v[0][0] = 3;
    v[0][1] = 2;
    v[1][0] = 1;
    v[1][1] = 4;
    prinf(v);
    for(auto &it:v){//&很重要
        sort(it.begin(),it.end());
    }
    prinf(v);
    sort(v.begin(),v.end());
    prinf(v);

例题
解法

#include <bits/stdc++.h>

using namespace std;

map<vector<int>, int> q; //first have q[first]=second
vector<vector<int> >ans;
void prinf(vector<vector<int>> v){
    for (auto it : v)
    {
        for(int i=0;i<it.size();i++){
            printf("%d ",it[i]);
        }
        cout<<endl;
    }
    cout<<endl;
}
int main(int argc, char *argv[])
{
    int n, m, i, j;
    cin >> n >> m;
    vector<int> v(m);
    for (int i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &v[j]);
        }
        q[v]++;
    }
    for (auto it :q){
        // for(int i=0;i<it.first.size();i++){
        //     printf("%d ",it.first[i]);
        // }
        //printf(":...%d",it.second);
        //cout<<endl;
        ans.push_back(it.first);
        ans[ans.size()-1].insert(ans[ans.size()-1].begin(),-1*it.second);
    }
    printf("%d\\n",ans.size());
    sort(ans.begin(),ans.end());
    //prinf(ans);
    // ?: flag?"true that":"false that"
    // printf("%s\\n",true?"true that":"false that");
    // printf("%s\\n",false?"true that":"false that");
    for(auto it:ans){
        for(int i=0;i<it.size();i++){
            printf("%d%s",i==0?-it[i]:it[i],i==it.size()-1?"\\n":" ");
        }
    }
    return 0;
}

vector[]

点击跳转

补充

取模

①: a b % m o d = a % ( b × m o d ) b \\frac{a}{b}\\%mod ={\\frac{a\\%(b \\times mod)}{b}} ba%mod=ba%(b×mod),使用过程 注意数据范围
②: a b % m o d = a × b m o d − 2 % m o d \\frac{a}{b}\\%mod=a \\times b^{mod-2}\\%mod ba%mod=a×bmod2%mod

以上是关于讲解STL的主要内容,如果未能解决你的问题,请参考以下文章

4.STL简单容器(cghVector)的实现

比给定值最小的最大元素的 STL 算法

STL容器自定义内存分配器

STL容器自定义内存分配器

STL容器自定义内存分配器

C++拾取——使用stl标准库生成等差等比数列的方法