19、线性容器、适配器容器

news2024/11/25 13:41:56

19、线性容器、适配器容器

  • 线性容器
    • 向量 vector
      • 初始化
      • 迭代器使用
    • 双端队列 deque
      • 双端队列和向量的差别
      • 成员函数
    • 列表 list
      • 常用函数
  • 适配器容器
    • 队列

线性容器

向量 vector

成员函数

front() 获取首元素
back() 获取尾元素
insert() 插入元素
erase() 删除元素
push_back() 添加尾元素
pop_back() 删除尾元素

empty() 判空
clear() 清空
size() 向量维护的元素个数
resize() 设置向量元素个数获取向量容量
capacity() 获取向量容器
reserve()  设置向量的容量

初始化

向量中的元素被存储在一段连续的内存空间中
vector<int> values{3,10,2,66,18,22,5,7,11};values.reserve(15);
在这里插入图片描述

  • 向量维护的内存空间会随着新元素的增加而自动增长
  • 内存空间的连续性不会妨碍向量元素的增加,如果内存空间无法满足新元素的增加,向量会开辟新的足够的连续内存空间,并把原内存空间的数据复制到新的内存空间,释放原内存空间.
  • 向量的增加会伴随着内存空间的分配和释放,元素复制和销毁等额外开销。
  • 如果能够在创建向量时,合理预分配一些空间将很大程度上缓解这些额外开销。
// 向量
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

class Student{
public:
    Student(const string& name = ""):m_name(name){
        cout << "缺省构造了" << m_name << "(" << this << ")" << endl;
    }
    Student(const Student& that):m_name(that.m_name){
        cout << "用" << that.m_name << "(" << &that << ") 拷贝构造了" << m_name << "(" << this << ")" << endl;
    }
    ~Student(){
        cout << "析构了" << m_name << "(" << this << ")" << endl;
    }
private:
    string m_name; // 姓名
};

int main(){
    vector<Student> vs;
    vs.reserve(10);
    vs.push_back(Student("张飞"));
    vs.push_back(Student("赵云"));
    vs.push_back(Student("关羽"));
   
    getchar();
    return 0;
}//

迭代器使用

在这里插入图片描述

// 向量
#include <iostream>
#include <vector>
#include <algorithm>   // find/sort
using namespace std;

class Student{
public:
    Student(const string& name = "",int age = 0):m_name(name),m_age(age){}
    bool operator==(const Student& that)const{
        return m_name == that.m_name && m_age == that.m_age;
    }
    bool operator<(const Student& that)const{
        return m_age < that.m_age;
    }
    bool operator>(const Student& that)const{
        return m_age > that.m_age;
    }
private:
    string m_name; // 姓名
    int m_age;     // 年龄
    friend ostream& operator<<(ostream& os,const Student& stu);
};
ostream& operator<<(ostream& os,const Student& stu){
    return os << stu.m_name << ":" << stu.m_age;
}

void print(const string& str,vector<Student>& v){
    cout << str << endl;
    typedef vector<Student>::iterator IT;
    for(IT it = v.begin(); it != v.end();++it){
        cout << *it << endl;
    }
    cout << "----------------------------" << endl;
}

int main(){
    vector<Student> vs;
    vs.reserve(4);
    vs.push_back(Student("张飞",22));
    vs.push_back(Student("赵云",25));
    vs.push_back(Student("关羽",30));
    vs.push_back(Student("马超",32));
    vs.push_back(Student("黄忠",45));

    print("添加元素后:",vs); 

    vs.insert(vs.begin(),Student("刘备",33));    // 增
    print("在迭代器指向的位置插入元素后:",vs);

    vs.erase(vs.begin());                        // 删
    print("删除迭代器指向的位置的元素后:",vs);

    typedef vector<Student>::iterator IT;
    IT it = vs.begin();                          // 改
    *it = Student("诸葛亮",32);
    print("更改迭代器指向位置的元素后:",vs);

    IT fit = find(vs.begin(),vs.end(),Student("赵云",25));  // 查
    if(fit != vs.end()){
        vs.erase(fit);
        print("找到并删除后:",vs);
    }else
        cout << "没有找到" << endl;
   
    sort(vs.begin(),vs.end(),greater<Student>());
    print("排序后:",vs);

    cout << "vs的容量:" << vs.capacity() << endl;
    cout << "vs的大小:" << vs.size() << endl;

    vs.resize(6);

    print("resize之后:",vs);

    return 0;
}//








双端队列 deque

双端队列和向量的差别

  • 和向量差别就是首尾两端同样都是开放的,因此他同时提供了首尾两端增删元素的接口。
  • 没有提供设置/获取容量的函数,设置和获取容器大小的函数存在

成员函数


front() 获取首元素
back() 获取尾元素
insert() 插入元素
erase() 删除元素

push_front() 添加首元素
pop_front() 删除首元素
push_back()添加尾元素
pop_back()删除尾元素
empty()判空
clear()清空
size()向量维护元素个数
resize()设置向量元素个数

// 双端队列
#include <iostream>
#include <deque>
#include <algorithm>   // find/sort
using namespace std;

class Student{
public:
    Student(const string& name = "",int age = 0):m_name(name),m_age(age){}
    bool operator==(const Student& that)const{
        return m_name == that.m_name && m_age == that.m_age;
    }
    bool operator<(const Student& that)const{
        return m_age < that.m_age;
    }
    bool operator>(const Student& that)const{
        return m_age > that.m_age;
    }
private:
    string m_name; // 姓名
    int m_age;     // 年龄
    friend ostream& operator<<(ostream& os,const Student& stu);
};
ostream& operator<<(ostream& os,const Student& stu){
    return os << stu.m_name << ":" << stu.m_age;
}

void print(const string& str,deque<Student>& v){
    cout << str << endl;
/*  typedef deque<Student>::iterator IT;
    for(IT it = v.begin(); it != v.end();++it){
        cout << *it << endl;
    }*/
/*
    for(const auto& s : v)  // -std=c++11
        cout << s << endl;*/

    for(int i=0;i<v.size();i++)
        cout << v[i] << endl;

    cout << "----------------------------" << endl;
}

int main(){
    deque<Student> vs;
    vs.push_front(Student("张飞",22));
    vs.push_front(Student("赵云",25));
    vs.push_front(Student("关羽",30));
    vs.push_back(Student("马超",32));
    vs.push_back(Student("黄忠",45));

    print("添加元素后:",vs); 

    vs.insert(vs.begin(),Student("刘备",33));    // 增
    print("在迭代器指向的位置插入元素后:",vs);

    vs.erase(vs.begin());                        // 删
    print("删除迭代器指向的位置的元素后:",vs);

    typedef deque<Student>::iterator IT;
    IT it = vs.begin();                          // 改
    *it = Student("诸葛亮",32);
    print("更改迭代器指向位置的元素后:",vs);

    IT fit = find(vs.begin(),vs.end(),Student("赵云",25));  // 查
    if(fit != vs.end()){
        vs.erase(fit);
        print("找到并删除后:",vs);
    }else
        cout << "没有找到" << endl;
   
    sort(vs.begin(),vs.end(),greater<Student>());
    print("排序后:",vs);

    cout << "vs的大小:" << vs.size() << endl;

    vs.resize(6);

    print("resize之后:",vs);

    return 0;
}//









列表 list

常用函数

front()获取首元素
back()获取尾元素
insert()插入元素
erase()删除元素
push_front()添加首元素
pop_front()删除首元素
push_back()添加尾元素
pop_back()删除尾元素
empty()判空
clear()清空
size()向量维护元素个数
resize()设置向量元素个数
  • 唯一化
    • void unique(void); 将连续重复出现的元素唯一化
  • 排序 (都是全局排序) 注意sort是成员函数
    • void sort(void)通过 < 比大小
    • template<class LESS>void sort(LESS less) 通过比较器比大小
  • 拆分: 将参数列表中的部分或全部元素剪切到调用列表中
    • template<class IT>void splice( IT pos, list& lst )
    • template<class IT>void splice( IT pos, list& lst, IT del )
    • template<class IT>void splice( IT pos, list& lst, IT begin, IT end )
// 列表
#include <iostream>
#include <list>
using namespace std;

void print(const string& str, list<int>& l){
    cout << str << endl;
    for( const auto& i : l)
        cout << i << ' ';
    cout << endl;
    cout << "-------------------------------------------" << endl;
}

int main(){
    list<int> ls;
    for(int i=0; i<5;i++)    //  14 13 12 11 10
        ls.push_front(10+i);
    for(int i=0;i<5;i++)    // 14 13 12 11 10 10 11 12 23 14
        ls.push_back(10+i);
    print("添加首尾节点后:",ls);

    // 唯一化
    ls.unique();
    print("唯一化后:",ls);

    ls.remove(13);
    print("删除所有的13后:",ls);

    ls.sort();  // 排序
    print("升序排序后:",ls);

    ls.sort(greater<int>());
    print("降序排序后:",ls);

    list<int> lst{1000,2000,300,4000,5000,6000};

//  ls.splice(++ls.begin(),lst); // 将lst的所有元素剪切到ls的第二个位置
//  ls.splice(++ls.begin(),lst,lst.begin()); // 将lst的第一个元素剪切到ls的第二个位置
    ls.splice(++ls.begin(),lst,++lst.begin(),--lst.end()); // 将lst的第二个元素 到 倒数第二个元素 剪切到ls的第二个位置
    print("ls :",ls);
    print("lst:",lst);

    return 0;
}

适配器容器

在这里插入图片描述
在这里插入图片描述

// 栈
#include <iostream>
#include <stack>
#include <vector>
//#include <deque>
#include <list>
using namespace std;

int main(){
//  stack<int> s;
//  stack<int,vector<int> > s;
//  stack<int,list<int> > s;
    stack<int,deque<int> > s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.push(6);

    while(!s.empty()){
        cout << s.top() << endl; // 获取栈顶元素
        s.pop(); // 弹栈(删除栈顶元素)
    }
    return 0;
}

队列

在这里插入图片描述
在这里插入图片描述

// 队列
#include <iostream>
#include <queue>
#include <vector>
//#include <deque>
#include <list>
using namespace std;

int main(){
//  queue<int> s;
//  queue<int,vector<int> > s;  // error:向量不能做为队列的底层容器  没有pop_front
//  queue<int,list<int> > s;
    queue<int,deque<int> > s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.push(6);

    while(!s.empty()){
        cout << s.front() << endl; // 获取队首元素
        s.pop(); // 出队(删除队首元素)
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC实战——WGAN(Wasserstein GAN)

AIGC实战——WGAN 0. 前言1. WGAN-GP1.1 Wasserstein 损失1.2 Lipschitz 约束1.3 强制 Lipschitz 约束1.4 梯度惩罚损失1.5 训练 WGAN-GP 2. GAN 与 WGAN-GP 的关键区别3. WGAN-GP 模型分析小结系列链接 0. 前言 原始的生成对抗网络 (Generative Adversarial Network, GAN) 在…

【js】数字字符串的比较

今天排查一个日历组件的bug&#xff0c;month打印出来是9&#xff0c;month1打印出来为12&#xff0c;比较month和month1大小进入if或者else&#xff0c;奇怪的是每次都是进入的month>month1语句里面 打印typeOf&#xff08;a&#xff09;和typeOf&#xff08;b&#xff09…

深入学习Redis:从入门到实战

Redis快速入门 1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端1.4.1.R…

MySQL - InnoDB 和 MyISAM 的索引实现的区别

InnoDB 和 MyISAM 底层都是 B 树的实现&#xff0c;但是二者却完全不同 。 主键索引文件存储不同 MyISAM 引擎的索引文件和数据文件是分离的&#xff0c;而 InnoDB 引擎的索引文件和数据文件是不分离的。 MyISAM 引擎的叶子节点存储的是数据文件的地址&#xff0c;而 InnoDB 的…

VR全景开启智能化酒店获客新模式,打造高人气入住

一般而言&#xff0c;消费者如果想要了解酒店信息&#xff0c;渠道主要是通过第三方平台商家发布的图片&#xff0c;有多次入住经验的可能还会看下以往用户的评价&#xff0c;以及借助酒店的平面宣传效果图看下空间布局等&#xff0c;但是这种用户评价的主观色彩&#xff0c;很…

【数据结构与算法】实现红黑树

文章目录 一、红黑树的五条规则二、红黑树的三种变换2.1.变色2.2.左旋转2.3.右旋转 三、红黑树的插入操作3.1.情况13.2.情况23.3.情况33.4.情况43.5.情况53.6.案例插入10插入9插入8插入7插入6插入5插入4插入3插入2插入1 一、红黑树的五条规则 红黑树除了符合二叉搜索树的基本规…

使用WebyogSQLyog使用数据库

数据库 实现数据持久化到本地&#xff1a; 使用完整的管理系统统一管理&#xff0c; 数据库&#xff08;DateBase&#xff09;&#xff1a; 为了方便数据存储和管理&#xff08;增删改查&#xff09;&#xff0c;将数据按照特定的规则存储起来 安装WebyogSQLyog -- 创建数…

探索低代码的潜力、挑战与未来展望

低代码开发作为一种新兴的开发方式&#xff0c;正在逐渐改变着传统的编程模式&#xff0c;低代码使得开发者无需编写大量的代码即可快速构建各种应用程序。然而&#xff0c;低代码也引发了一系列争议&#xff0c;有人称赞其为提升效率的利器&#xff0c;也有人担忧其可能带来的…

【Spring教程22】Spring框架实战:Spring事务角色与 Spring事务属性、事务传播行为代码示例详解

目录 1.Spring事务角色1.1 未开启Spring事务之前:1.2 开启Spring的事务管理后2 Spring事务属性2.1 事务配置2.2 转账业务追加日志案例2.2.1 需求分析2.2.2 环境准备 2.3 事务传播行为2.3.1.修改logService改变事务的传播行为2.3.2 事务传播行为的可选值 欢迎大家回到《 Java教…

【EXCEL】规划求解

题目&#xff1a; s1:设置EXCEL加载项(第一次使用)&#xff1a;开发工具–>EXCEL加载项–>勾选“规划求解加载项”–>确定 s2&#xff1a;填入公式&#xff08;等号左边&#xff09; s3&#xff1a;数据–>规划求解 s4&#xff1a;得出结果 总结&#xff1a;这玩意…

0基础学java-day15(泛型)

一、泛型 1 泛型的理解和好处 1.1 看一个需求 【不小心加入其它类型&#xff0c;会导致出现类型转换异常】 package com.hspedu.generic;import java.util.ArrayList;/*** author 林然* version 1.0*/ public class Generic01 {SuppressWarnings("all")public st…

NSSCTF web刷题记录7

文章目录 [SDCTF 2022]CURL Up and Read [SDCTF 2022]CURL Up and Read 考点&#xff1a;SSRF 打开题目发现是curl命令&#xff0c;提示填入url 尝试http://www.baidu.com&#xff0c;成功跳转 将url的字符串拿去解码&#xff0c;得到json格式数据 读取下环境变量&#xff0c…

【算法集训】基础数据结构:三、链表

链表就是将所有数据都用一个链子串起来&#xff0c;其中链表也有多种形式&#xff0c;包含单向链表、双向链表等&#xff1b; 现在毕竟还是基础阶段&#xff0c;就先学习单链表吧&#xff1b; 链表用头结点head表示一整个链表&#xff0c;每个链表的节点包含当前节点的值val和下…

社交媒体图像识别与情感分析

社交媒体图像识别与情感分析是当前人工智能领域的一个研究热点。通过对社交媒体上大量的图像和文本数据进行深度学习和情感分析&#xff0c;可以提取出图像中的情感信息&#xff0c;从而为社交媒体用户提供更加个性化和精准的内容推荐和服务。 在社交媒体图像识别方面&#xff…

LabVIEW与Tektronix示波器实现电源测试自动化

LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域&#xff0c;自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器&#xff0c;开发一个自动化测试项目。该项目旨在自动…

C#结合JavaScript实现多文件上传

目录 需求 引入 关键代码 操作界面 ​JavaScript包程序 服务端 ashx 程序 服务端上传后处理程序 小结 需求 在许多应用场景里&#xff0c;多文件上传是一项比较实用的功能。实际应用中&#xff0c;多文件上传可以考虑如下需求&#xff1a; 1、对上传文件的类型、大小…

《微信小程序开发从入门到实战》学习四十五

4.4 云函数 云函数是开发者提前定义好的、保存在云端并且将在云端运行的JS函数。 开发者先定义好云函数&#xff0c;再使用微信开发工具将云函数上传到云空间&#xff0c;在云开发控制台中可看到已经上传的云函数。 云函数运行在云端Node.js环境中。 小程序端通过wx.cloud.…

使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch数据同步

一、Linux环境要求 二、准备工作 2.1 Linux安装jdk 2.2 linux安装python 2.3 下载DataX&#xff1a; 三、DataX压缩包导入&#xff0c;解压缩 四、编写同步Job 五、执行Job 六、定时更新 6.1 创建定时任务 6.2 提交定时任务 6.3 查看定时任务 七、增量更新思路 一、Linux环境要…

内外网文件传输中的4大风险,你都知道吗?

一般来说&#xff0c;企业实施内外网隔离的原因主要就是两个&#xff1a;外因和内因。外因就是因为政策法规要求&#xff0c;这个主要是面向一些特定行业的&#xff0c;比如党政机关、金融、医疗、能源等行业&#xff0c;受这方面监管和要求的会比较多。内因就是为了自身的数据…

C++面试宝典第4题:合并链表

题目 有一个链表&#xff0c;其节点声明如下&#xff1a; struct TNode {int nData;struct TNode *pNext;TNode(int x) : nData(x), pNext(NULL) {} }; 现给定两个按升序排列的单链表pA和pB&#xff0c;请编写一个函数&#xff0c;实现这两个单链表的合并。合并后&#xff0c;…