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


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

    NO.1 stack 栈

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

    • #include<stack>

    • 定义方式

    • stack<_template> s;//参数也是数据类型,这是栈的定义方式

    • 常用操作

    • s.empty()//如果栈为空返回true,否则返回false

    • s.size()//返回栈中元素的个数

    • s.pop()//删除栈顶元素但不返回其值

    • s.top()//返回栈顶的元素,但不删除该元素

    • s.push(X)//在栈顶压入新元素 ,参数X为要压入的元素

    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

    • #include<queue>// 队列

    • 定义方式

    • queue<_template> q; //参数是数据类型,这是队列的定义方式

    • 常用操作

    • q.empty()// 如果队列为空返回true,否则返回false

    • q.size() // 返回队列中元素的个数

    • q.pop() //删除队列首元素但不返回其值

    • q.front() // 返回队首元素的值,但不删除该元素

    • q.push(X) //在队尾压入新元素 ,X为要压入的元素

    • q.back() //返回队列尾元素的值,但不删除该元素

    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 优先队列或堆

    • #include<queue>

    • 定义方法

    • priority_queue<_template,vector<_template>,cmp> q;//vector是什么,后面会讲

    cmp是我们自己编的一个这个堆比较优先级的形似函数的结构体,如下:

    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

    • 常用操作

    注:取自https://www.cnblogs.com/xzxl/p/7266404.html

    • empty()//如果队列为空,则返回真

    • pop()//删除对顶元素,删除第一个元素

    • push()//加入一个元素

    • size()//返回优先队列中拥有的元素个数

    • top()//返回优先队列对顶元素,返回优先队列中有最高优先级的元素

    • For example:

    #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 双端队列

    • #include<deque>;

    • 定义方式

    • deque<_template> deq;

    • 常用操作

    • push_back(int x)//尾部加入

    • size()//长度

    • resize(int a)//保留0至a-1个元素,其余删掉

    • empty()//同上

    • begin()//返回首元素迭代器(迭代器到后面会有介绍)

    • end()//返回尾元素迭代器

    • push_front(int x)//望首加元素

    • pop_front()//删除首元素

    • pop_back()//删除尾元素

    • front()//返回首元素

    • back()//返回尾元素

    注:若想访问,用数组下标即可。比如我想访问第七个这个元素,则dep[7];

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

    NO.5 迭代器

    • 迭代器可以简单地理解为指针,怎样声明:
    容器名<_template>::iterator it;
    
    • 如何遍历: 以deque为例
    for (it = deq.begin(); it != deq.end(); it++)
        cout << *it << endl;
    
    这里begin返回第一个位置的迭代器,end返回最后一个的后一个位置的迭代器

    这样*it为每一个元素

    No.6 set 集合

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

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

    • #include<set>

    • 定义方式

    • set<_template> S;

    • 常用操作

    • insert()//加入元素

    • size()//长度

    • clear()//清空

    • ......

    还有许多操作...

    For example:

    
    #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<vector>

    • 定义方式

    • vector<_template>

    • 常用操作

    • v.push_back();// 尾部添加元素

    • v.pop_back();// 尾部删除元素

    • v.size();// 元素数量

    • v.resize(int x);// 保留1至x的元素

    • For example

    #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 映射

    • #inlcude<map>

    • 定义方式

    • map<_template,_template> M;

    • 常用操作

    • 对于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在贮存是会按照一种顺序,所以在用结构体时,需要重载<号

    • For example:

    #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是一个数对

    • #include<pair>

    • 定义方式

    https://blog.csdn.net/sevenjoin/article/details/81937695

    • 常用操作

    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的公有数据成员
    
    • For example:

    
    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.

  • 相关阅读:
    springboot2.0集成RestTemplate
    RestTemplate HttpMessageConverter报错的解决方案no suitable HttpMessageConverter
    vue条件渲染+列表渲染+事件处理器
    vue计算属性+vue中class与style绑定
    vue选项数据+vue模板语法
    vue安装配置+生命周期
    sass案例--实现高仿今日头条H5版新闻列表页
    sass内置函数
    sass继承+嵌套+条件控制
    sass常见的基本数据类型+加减乘除基本运算
  • 原文地址:https://www.cnblogs.com/TianMeng-hyl/p/12229033.html
Copyright © 2020-2023  润新知