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;

这样*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是一个数对

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.

原文地址:https://www.cnblogs.com/TianMeng-hyl/p/12229033.html

时间: 2024-07-31 13:48:23

STL综合 容器常用集合 —— hyl天梦的相关文章

c++STL之常用集合算法

set_intersection:求两个容器的交集 set_union:求两个集合的并集 set_difference:求两个集合的差集 1.set_intersection #include<iostream> using namespace std; #include <vector> #include <algorithm> //常用集合算法 set_intersection void myPrint(int val) { cout << val &l

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

JAVA常用集合框架用法详解基础篇一之Colletion接口

首先,在学习集合之前我们能够使用的可以存储多个元素的容器就是数组. 下面举几个例子主要是引出集合类的: 1.8,4,5,6,7,55,7,8  像这样的类型相同的可以使用数组来存储,本例可以用int[] arr来存储. 2."zhnagsan",true,68 像这样的可以使用StringBuilder或者StringBuffer来存储,但最终需要使用.toString()的方法转换成字符串才可以使用.即 变为:"zhnagsantrue68". 3."李

c++ stl deque容器

c++中,Deque容器和vector相似,deque内部也采用动态数组来管理元素,支持随机存取..头文件<deque> 1.deque和vector的不同之处: 1)两端都可以较快速地按插元素和删除元素,而vector只能在尾端进行 2)在对内存有所限制的系统中,deque可以包含更多的元素,因为它不止一块内存.因此deque的max_size()可能更大 3)deque不支持对容量和内存的重分配时机的控制. 4)deque的内存区块不再被使用时,会被释放.deque的内存大小是可缩减的,由

顺序容器和关联容器的特点&amp;STL各容器粗略对比

顺序容器和关联容器的特点1.所有的关联容器都会自动排序,但map和set不允许重复元素,而multimap和multiset允许重复元素 2.关联容器中,map和multimap的key和val是分开的,而set和multiset的key和val是相同的 3.除了vector和deque的迭代器为随机迭代器之外,其余容器的迭代器都是双向迭代器,不能进行++操作 4.顺序容器的insert函数的三种形式为: iterator insert(iterator position, value_type

STL之容器适配器queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是如何借助基础容器实现一种常用的数据结构stack (栈),本文介绍下另外一种STL内部定义的另外一种STL容器适配器queue(队列). 对于接触过数据结构的人来说,队列并不陌生,它是一种FIFO(first in first out)的数据结构.与栈相比,队列的不同之处在于:(1)队列是一种先进先出的数据结构,而栈则是一种后进先出的数据结构:(2)队列支持首尾两端的访问操作,而栈

.NET基础 (09)常用集合和泛型

常用集合和泛型1 int[]是引用类型还是值类型2 数组之间如何进行转换3 解释泛型的基本原理4 什么是泛型的主要约束和次要约束 常用集合和泛型1 int[]是引用类型还是值类型 数组类型是一族类型,它们都继承自System.Array,而System.Array又继承自System.Object.所有数组的类型都是引用类型. 引用类型的数组和值类型的数组的内存分配: 2 数组之间如何进行转换 数组类型在符合条件的情况下可以进行隐式地转换,条件包括:数组维数必须相同:目标项目类型和源项目类型必须

STL顺序容器【vector】【deque】【list】

我们都知道,stl容器中将容器分为两类,顺序容器和关联容器. 顺序容器有三种即vector,deque,以及list 一:顺序容器的常用操作 1:首先顺序容器的迭代器 定义:T<C>::iterator iter; /*支持所有顺序容器*/ *iter返回迭代器的引用 iter->mem 对iter解引用,等效于(*iter).men ++iter|iter++自加 --iter|iter--自减 iter1==iter2  |  iter1!=iter2比较 /*只支持vector 和

c++复习:STL之容器

1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别呢. string和char*的比较 string是一个类, char*是一个指向字符的指针. string封装了char*,管理这个字符串,是一个char*型的容器. string不用考虑内存释放和越界. string管理char*所分配的内存.每一次string的复制,取