其他分享
首页 > 其他分享> > STL综合 容器常用集合 —— hyl天梦

STL综合 容器常用集合 —— hyl天梦

作者:互联网

STL 标准模板库 容器 用法集结

NO.1 stack 栈

注:取自https://www.cnblogs.com/aiguona/p/7200837.html

For exanple:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
int main()
{
    stack<char> s;
    s.push(a);
    cout << s.top() <<endl;
    s.push(b);
    cout << s.top();
    s,pop();
    cout << s.top();
    return 0;
}

NO.2 queue 队列

注:取自https://www.cnblogs.com/aiguona/p/7200837.html

For example:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
int main()
{
    queue<int> q;
    stack<char> s;
    q.push(1);
    cout << q.enpty() << endl;
    q.push(2);
    cout << q.front() << endl;
    q.pop();
    cout << q.front() << endl;
    q.pop();
    cout << q.empty() <<endl;
    return 0;
}

注:STL虽然方便,但使用常数巨大,如若使用以上两种数据结构,建议手写。

NO.3 priority_queue 优先队列或堆

struct cmp{
    bool operator () (int a,int b)
    {
        return a>b;
    }
}; 

注:这是一个小根堆大于号是小根堆

struct cmp{
    bool operator () (int a,int b)
    {
        return a<b;
    }
}; 

注:这是一个大根堆小于号是大根堆

具体如何定义cmp请参照 https://www.cnblogs.com/xzxl/p/7266404.html
operator重载运算符请参照 https://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html

#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>//rand()库
using namespace std;
struct cmp{
    bool operator () (int a,int b)
    {
        return a>b;//小根堆
    }
}; 
priority_queue<int,vector<int>,cmp> q;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x=rand()%1000;//生成随机数,不同电脑数不一样,电脑相同,数可能一样,非常慢。
        cout<<x<<" ";
        q.push(x);
    }
    cout<<endl;
    cout<<q.size()<<endl; 
    while(q.empty()==0)
    {
        cout<<q.top()<<" ";
        q.pop();
    }
    cout<<endl;
    cout<<q.size()<<endl;
}

No.4 deque 双端队列

以上皆为常用操作,若还想了解其它操作,请登录网站https://www.cnblogs.com/TianMeng-hyl/p/12229706.html

NO.5 迭代器

容器名<_template>::iterator it;
for (it = deq.begin(); it != deq.end(); it++)
    cout << *it << endl;

这样*it为每一个元素

No.6 set 集合

代码网址<blog.csdn.net/byn12345/article/details/79523516>

注:因为集合的特殊性,其中的每一个元素会且仅会出现一次,就是说不会有重复元素,而且会排序


#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
     set<int> s;
     s.insert(1);
     s.insert(2);
     s.insert(3);
     s.insert(1);
     cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
     cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
     cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
     s.clear();
     if(s.empty())
     {
         cout<<"set 为空 !!!"<<endl;
     }
     cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
     return 0;
}

No.7 vector 向量

通俗点说,就是不定长数组

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int main()
{
    v.push_back(1);
    v.pop_back();
    cout<<v.size()<<endl;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.resize(2); //数组元素:1,2
    cout<<v.size()<<endl;
}

No.8 map 映射

map<string,int> M;
M["Monday"]=1; 

简单来说,就是定义了一个下个可以是任何东西的数组。
所有的容器,都可以通过迭代器的方法遍历。需要begin()和end(),但也略有不同,每一个it都是一个pair(pair是什么下面会讲),pair的first,是数组下标,second是值,例如:

#include<iostream>
#include<map>
using namespace std;
map<string,int> M;
int main()
{
    string day;
    int i;
    while(cin>>day)
    {
        cin>>i;
        M[day]=i;
        if(i==7) break;
    }
    map<string,int>::iterator it;
    for(it=M.begin();it!=M.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
} 
/*
Monday 1
Tuesday 2
Wednesday 3
Thursday 4
Friday 5
Saturday 6
Sunday 7
*/

map在贮存是会按照一种顺序,所以在用结构体时,需要重载<号

#include<iostream>
#include<map>
using namespace std;
map<string,int> M;
int main()
{
    string day;
    int i;
    while(cin>>day)
    {
        cin>>i;
        M[day]=i;
        if(i==7) break;
    }
    map<string,int>::iterator it;
    for(it=M.begin();it!=M.end();it++)
    {
        cout<<(*it).first<<" "<<(*it).second<<endl;
    }
} 

大家看到了两种遍历方式,都可。

No.9 pair

你可以理解为pair是一个数对

pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < * * p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

std::pair<std::string, int> getPreson() {
    return std::make_pair("Sven", 25);
}
 
int main(int argc, char **argv) {
    std::string name;
    int ages;
 
    std::tie(name, ages) = getPreson();
 
    std::cout << "name: " << name << ", ages: " << ages << std::endl;
 
    return 0;
}

除了迭代器,这是另一种接收方式,详见https://blog.csdn.net/sevenjoin/article/details/81937695.

标签:返回,std,STL,元素,hyl,int,pair,include,天梦
来源: https://www.cnblogs.com/TianMeng-hyl/p/12229033.html