STL常用容器(二)

1.queue容器

基本概念: Queue是一种先进先出的数据结构,有两个出口

队列容器允许从一端新增元素,从另一端删除元素

队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历

1. 构造函数: 
   - queue<T> que; // queue采用模板类实现,queue对象的默认构造形式
   - queue(const queue &que); // 拷贝构造函数
2. 赋值操作:
   - queue& operator=(const queue &que); // 重载等号操作符
3. 数据存取:
   - push(elem); // 往队尾中添加元素
   - pop(); // 从队头中移除第一个元素
   - back(); // 返回最后一个元素
   - front(); // 返回第一个元素
4. 大小操作:
   - empty(); // 判断堆栈中是否为空
   - size(); // 返回栈的大小

2. list容器

基本概念: 也是链表,是一种物理存储单元上的非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

功能: 将数据进行链式存储

STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。

1. list构造函数

   - list<T> lst; // list采用模板类实现,对象的默认构造形式
   - list(beg,  end); // 构造函数将(beg, end)区间中的元素拷贝到本身
   - lsit(n, elem); // 构造函数将n个elem拷贝到本身
   - list(const list &lst); // 拷贝构造函数

2. list赋值和交换

   - assign(beg, end); // 将(beg, end)区间中的数据拷贝给本身
   - assign(n, elem); // 将n个elem赋值给本身
   - list& operator=(const list &lst); //重载等号操作符
   - swap(lst); // 将lst与本身的元素互换

3. list大小操作

   - size(); // 返回容器中元素的个数
   - empty(); // 判断容器中是否为空
   - resize(num); // 重新指定容器的长度为num, 若容器变长,则默认值0填充新位置; 若容器变短,则将超出的部分进行删除
   - resize(num, elem); // 重新指定容器的长度为num, 若容器变长,则以elem值进行填充新位置; 若容器变短,则将超出的部分进行删除

4. list插入和删除

   - push_back(elem); // 在容器的尾部加入一个元素
   - pop_back(); // 删除容器中的最后一个元素
   - push_front(elem); // 在容器开头插入一个元素
   - pop_front(); // 从容器开头删除一个元素
   - insert(pop, elem);  // 在pos位置插入elem元素,返回新数据的位置
   - insert(pos, n, elem); // 在pos位置插入n个elem元素,无返回值
   - insert(pos, beg, end); // 在pos位置插入[beg, end)区间的数据,无返回值
   - clear(); 移除容器中所有的数据
   - erase(beg, end); // 删除[beg, end)区间的数据,返回下一个数据的位置
   - erase(pos); // 删除pos位置的数据,返回下一个元素的位置
   - remove(elem); // 删除容器中所有与elem元素相等的元素

5. list数据存取

   - front(); // 返回第一个元素
   - back(); // 返回最后一个元素

6. lsit反转和排序

   - reverse(); // 反转链表

   - sort(); // 链表排序

     排序规则: sort(bool Compare); // 来指定降序还是升序(自定义数据类型,必须指定排序规则)

3. set/multiset容器

本质: set/multiset属于关联式容器,底层结构是用二叉树实现

所有元素都会在插入时自动被排序(异)

set/multiset区别:

- set不允许容器中有重复的元素

- multiset允许容器中有重复的元素

  ------

1. set构造和赋值

   ​      构造:

   - set<T> st; // 默认构造函数
   - set(const set &st); // 拷贝构造函数

   ​      赋值:

   - set&  operator=(const set &st); // 重载等号操作符

2. set大小和交换

   - size(); // 返回容器中元素的数目
   - empty(); // 判断容器是否为空
   - swap(st); // 交换两个集合容器

3. set插入和删除

   -  insert(elem); // 在容器中插入元素
   -  erase(pos); // 删除pos迭代器中所指的元素
   -  erase(beg, end); // 删除区间[beg, end)间的所有元素,返回下一个元素的迭代器
   -  erase(elem); // 删除容器中值为elem的元素
   -  clear(); // 清除所有元素

4. set查找和统计

   - find(key); // 查找key是否存在,返回该键的元素的迭代器;若不存在,返回set.end()
   - count(key); // 统计key的元素个数5. pair对组创建

   ​	成对出现的数据,利用对组可以返回两个数据

   - pair<type, type> p (value1, value2);
   - pair<type, type> p = make_pair(value1, value2);

   ```c++
   pair<string, int> p(string("Tom"), 20);
   cout << "姓名: " << p.first << ", 年龄: " << p.second << endl;


6. set容器排序(默认升序, 这里是想改变排序规则)

   - 利用仿函数, 可以改变排序规则

   class Compare
   {
   	bool operator()(int v1, int v2){
           // 其中参数类型 由 创建set容器时的 类型来决定
   		return v1 > v2;
   	}
   };
   set<int,Compare> s2; // 在还未开始默认排序前,对默认排序进行修改(排序规则)
   for (set<int,Compare>::iterator it = s2.begin(); it != s2.end(); it++)
   {
       cout << *it << endl; 
   }
   
   
7. set存放自定义数据类型

4. map/multimap容器

基本概念:

- map中所有元素都为pair
- pair中第一个元素为key(键值),起索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
- map/multimap属于关联式容器,底层结构用二叉树实现
- 可以根据key快速找到value值

map和multimap区别:

- map不允许容器中有重复的key值元素
- multimap允许容器中有重复key值元素

------

1. map构造和赋值

   - map<T1, T2> mp; // map默认构造函数
   - map(const map &mp); // 拷贝构造函数
   - map& operator =(const map &mp); // 重载等号操作符
   --------------------------
   #include<map>
   
   void  printMap(map<int, int> &m)
   {
       for(map<int, int>::iterator it = m.begin(); it != m.end(); it++)
       {
           cout << "key = " << (*it).first << ", value = " << it->second << endl;
        }
   }
    
   void test01()
   {
       //创建map容器
       map<int, int> m;
       
       m.insert(pair<int, int>(1, 10));
       m.insert(pair<int, int>(2, 20));
       m.insert(pair<int, int>(3, 30));
       m.insert(pair<int, int>(4, 40));
       // 插入后会根据key值来排序
       printMap(m);
   }
	---------------------------2. map大小和交换

   - size(); // 返回容器中元素的数目
   - empty(); // 判断容器中是否为空
   - swap(st); // 交换两个集合容器

3. map插入和删除

   - insert(elem); // 在容器中插入元素(元素:对组 pair<>)
   - erase(pos); // 删除pos迭代器所指的元素,返回下一个元素的迭代器
   - erase(beg, end); // 删除区间[beg, end)的所有元素,返回下一个元素的迭代器
   - erase(key); // 删除容器中值为key的元素
   - clear(); // 清除所有元素

4. map查找和统计

   - find(key); // 查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()

   - count(key); // 统计key的元素个数

     其中,在map容器中的count() 不是0就是1;

     ​		 在maltimap容器中count()可能大于15. map容器排序

   - map容器默认排序规则为 按照key值 从小到大进行排序
   - 与set容器一样,利用仿函数来改变排序规则
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值