重学C++系列之STL库

一、什么是STL库

        STL是“Standard Template Library”的缩写,中文翻译为“标准模板库”。C++STL是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如字符串操作、链表、队列、栈。

        C++标准模板库的核心包括以下三个组件:

C++标准模板库组件
组件描述
容器(顺序容器、关联容器)容器是用来管理某一类对象的集合。C++提供了各种不同类型的容器,比如list, vector, map
算法算法作用于容器,提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作
迭代器迭代器用于遍历对象集合的元素。类似于指针

二、STL的使用案例

        1、可以去看官网的操作文档,C++中文参考手册

        2、字符串模板类string

                加上头文件#include <string>

#include <iostream>
#include <string>
using namespace std;

int main()
{
    // 1、定义
    string s1("hello");
    string s2 = "world";
    cout << "s1 = " << s1 << endl;
    cout << "s2 = " << s2 << endl;

    // 2、赋值
    string s3 = s1;
    string s4 = s1 + s2;
    string s5 = s1;
    s5 += s2;
    cout << "s3 = " << s3 << endl;
    cout << "s4 = " << s4 << endl;
    cout << "s5 = " << s5 << endl;

    // 3、at, 返回某个位置的引用
    string s6 = s1;
    s6.at(0) = 'p';
    cout << "s6 = " << s6 << endl;

    // 4、容量
    string s7 = s1;
    cout << "s7.size() = " << s7.size() << endl;
    cout << "s7.capacity() = " << s7.capacity() << endl;
    cout << "s7.length() = " << s7.length() << endl;
    string s8 = s1+s1+s1+s1+s1+s1;
    cout << "s8.capacity1() = " << s8.capacity() << endl;


    // 5、第一个字符和最后一个字符
    cout << "s1第一个字符" << s1.front() << endl;
    cout << "s1最后一个字符" << s1.back() << endl;

    // 6、返回字符串类中,字符串的指针地址
    const char* s_data = s1.data();
    const char* s_str = s1.c_str();

    cout << "s_data = " << s_data << endl;
    cout << "s_str = " << s_str << endl;

    // 7、插入
    string s9 = s1;
    s9.insert(0, "abcd");
    s9.insert(2, "xyz");
    cout << "s9 = " << s9 << endl;

    // 8、[]
    s1[0] = 'x';
    cout << "s1 = " << s1 << endl;

    // 9、追加
    string s10 = s1;
    s10.push_back('+');
    s10.append("xyz");
    cout << "s10 = " << s10 << endl;

    // 10、查找
    int index = s1.find("o");
    cout << "index = " << index << endl;

    // 11、比较
    string s12 = "hello";
    if(s12 == "hello")
    {
        cout << "s12 == hello" << endl;
    }

    // 12、迭代器
    string s13 = "hello world";
    cout << "s13 = ";
    for(string::iterator it = s13.begin(); it != s13.end(); it++)
    {
        cout << *it;
    }
    cout << endl;

    // 13、数值转换
    string s14 = "123456";
    int value = stoi(s14);
    cout << "value = " << value << endl;
    string s15 = to_string(value);
    cout << "s15 = " << s15 << endl;

    // 14、 获取子串
    string s16 = s13.substr(0, 5);
    cout << "s16 = " << s16 << endl;


    return 0;
}

        3、顺序容器vector

                  加上头文件#include <vector>

#include <iostream>
#include <vector>
using namespace std;

struct node 
{
    char *name;
    void func()
    {

    }
};




int main()
{
    vector<int> myvector;

    // 1、插入
    myvector.push_back(10);
    myvector.push_back(20);
    myvector.push_back(30);
    myvector.push_back(40);
    myvector.push_back(50);

    // 2、迭代器遍历
    vector<int>::iterator it;
    for(it = myvector.begin(); it != myvector.end(); it++)
    {
        cout << *it << '\t';
    }
    cout << endl;

    // 3、删除
    cout << "after del:" << endl;
    myvector.pop_back();
    myvector.pop_back();
   

    // 4、容量
    cout << "size = " << myvector.size() << endl;

    // 5、使用数组形式遍历
    for(int i = 0; i < myvector.size(); i++)
    {
        cout << myvector.at(i) << '\t';
    }
    cout << endl;


    return 0;
}

        4、双向链表容器list

                 加上头文件#include <list>

#include <iostream>
#include <list>


using namespace std;


class Student
{
private:
    string name;
    int age;
    int score;
public:
    Student(string name = string(), int age = 18, int score = 30)
    {
        this->age = age;
        this->name = name;
        this->score = score;
    }
    void show()
    {
        cout << name << '\t' << age << '\t' << score << endl;
    }
    friend bool cmp(const Student &s1, const Student &s2);
    string getName()const
    {
        return name;
    }
    void setAge(int Age)
    {
        this->age = Age;
    }
};

bool cmp(const Student &s1, const Student &s2)
{
    return s1.score > s2.score;
}



int main()
{
    list<Student> mylist;
    // 插到后面,尾插
    mylist.push_back(*(new Student("zhang3", 20, 90)));
    mylist.push_back(*(new Student("zhang4", 21, 79)));

    // 插到前面,头插
    mylist.push_front(*(new Student("zhang7", 19, 89)));
    mylist.push_front(*(new Student("zhang8", 25, 80)));

    // 遍历,用迭代器
    cout << "before sort" << endl;
    list<Student>::iterator it;
    for(it = mylist.begin(); it != mylist.end(); it++)
    {
        it->show();
        
    }

    // 排序
    mylist.sort(cmp);   // cmp函数是自定义的排序内容

    cout << "after sort" << endl;
    for(it = mylist.begin(); it != mylist.end(); it++)
    {
        it->show();
    }

    // 删除
    it = mylist.begin();
    it = mylist.erase(it);
    cout << "after del first" << endl;
    for(it = mylist.begin(); it != mylist.end(); it++)
    {
        it->show();
    }

    // 查找和修改
    for(it = mylist.begin(); it != mylist.end(); it++)
    {
        if(it->getName() == "zhang7")
        {
            cout << "find zhang7" << endl;
            it->setAge(50);
        }
    }

    for(it = mylist.begin(); it != mylist.end(); it++)
    {
        it->show();
        
    }


    return 0;
}

5、栈容器stack

#include <iostream>
#include <stack>

using namespace std;



int main()
{
    stack<int> mystack;
    // 入栈
    mystack.push(10);
    mystack.push(20);
    mystack.push(30);
    mystack.push(40);
    mystack.push(50);

    // 栈的元素个数
    cout << "size:" << mystack.size() << endl;

    // 栈没有空,就一直出栈
    int data;
    while(!mystack.empty())
    {
        data = mystack.top();   // 出栈前需要先获取栈顶元素
        mystack.pop();
        cout << data << "\t";
    }
    cout << endl;

    return 0;
}

6、队列容器queue

#include <iostream>
#include <queue>

using namespace std;



int main()
{
    queue<int> myqueue;

    // 入队
    myqueue.push(10);
    myqueue.push(20);
    myqueue.push(30);
    myqueue.push(40);
    myqueue.push(50);

    // 获取队列的元素个数 
    cout << "size: " << myqueue.size() << endl;
    // 队头元素
    cout << "front: " << myqueue.front() << endl;
    // 队尾元素
    cout << "back: " << myqueue.back() << endl;

    // 遍历
    int data;
    while(!myqueue.empty())
    {
        data = myqueue.front();
        myqueue.pop();  // 从队头出队的,先要保留队头元素
        cout << data << "\t";
    }
    cout << endl;

    return 0;
}

7、关联容器map 

#include <iostream>
#include <map>

using namespace std;



int main()
{
    // map是以键值对的方式存放数据
    // 第一个类型是键,第二类型是值,其中键不一定是整形可以是字符串
    map<int, string> mymap1;

    // 插入或者访问,键不一定要连续
    mymap1[1] = "a";
    mymap1[2] = "b";
    mymap1[10] = "c";
    mymap1[100] = "d";

    for(map<int, string>::iterator it = mymap1.begin(); it != mymap1.end(); it++)
    {
        // 键用first来访问,值用second来访问
        // 不允许使用cout << it << endl; 来访问
        cout << it->first << " = " << it->second << endl;
    }

    // 不一定要连续
    map<string, string> mymap2;
    mymap2["zhang3"] = "123";
    mymap2["li4"] = "124";
    mymap2["wang5"] = "45";
    mymap2["hong6"] = "4543";

    for(map<string, string>::iterator it = mymap2.begin(); it != mymap2.end(); it++)
    {
        // 键用first来访问,值用second来访问
        cout << it->first << " = " << it->second << endl;
    }

    return 0;
}

三、总结

        以上就是STL库中常用的容器以及对应的操作,使用时需要添加对应的头文件名,同时不同容器之间的有些相同操作是同名的,具体更多细节可以去看看官网的中文参考手册。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何为新一代可持续应用设计电机编码器

从定速电机转向提供位置和电流反馈的变速电机&#xff0c;不仅可以实现工艺改进&#xff0c;还能节省大量能源。本文介绍了电机编码器&#xff08;位置和速度&#xff09;、器件类型和技术以及应用案例。此外还解答了一些关键问题&#xff0c;例如对特定系统最重要的编码器性能…

Prometheus 的应用服务发现及黑河部署等

目录 promtool检查语法 部署Prometheus Server 检查语法是否规范 部署node-exporter 部署Consul 直接请求API进行服务注册 使用register命令注册服务&#xff08;建议使用&#xff09; 单个和多个注册&#xff0c;多个后面多加了s 在Prometheus上做consul的服务发现 部署…

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…

【无标题】JSP--Java的服务器页面

jsp是什么&#xff1f; jsp的全称是Java server pages,翻译过来就是java的服务器页面。 jsp有什么作用&#xff1f; jsp的主要作用是代替Servlet程序回传html页面的数据&#xff0c;因为Servlet程序回传html页面数据是一件非常繁琐的事情&#xff0c;开发成本和维护成本都非常高…

StarRocks Friends 广州站精彩回顾

上周六&#xff0c;StarRocks & Friends 活动在羊城广州成功举行&#xff0c;社区的小伙伴齐聚一堂&#xff0c;共同探讨了 StarRocks 在业界的应用实践和湖仓一体等热门话题。 本文总结了技术交流活动的关键内容和视频资料&#xff0c;感谢社区每一位小伙伴的支持和参与&…

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播&#xff08;Multicast&#xff09;方式的数据传输是基于 UDP 完成的。因此 &#xff0c;与 UDP 服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP 数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入&#xff08;注…

【Uniapp 的APP热更新】

Uniapp 的APP热更新功能依赖于其打包工具 HBuilder&#xff0c;具体步骤如下&#xff1a; 1. 在 HBuilder 中构建并打包出应用程序 具体步骤&#xff1a; 1.点击发行&#xff0c;点击制作wgt包 2.根据需求修改文件储存路径和其他配置&#xff0c;点击确定 3.等待打包完成&a…

Day10-作业(SpringBootWeb案例)

作业1&#xff1a;完成课上预留给大家自己完成的功能 【部门管理的修改功能】 注意&#xff1a; 部门管理的修改功能&#xff0c;需要开发两个接口&#xff1a; 先开发根据ID查询部门信息的接口&#xff0c;该接口用户查询数据并展示 。(一定一定先做这个功能) 再开发根据ID…

iOS开发-格式化时间显示刚刚几分钟前几小时前等

iOS开发-格式化时间显示刚刚几分钟前几小时前等 在开发中经常遇到从服务端获取的时间戳&#xff0c;需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 主要用到了NSCalendar、NSDateComponents这两个类 NSString *result nil;NSCalendarUnit components (NSC…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

数据结构-链表结构-双向链表

双向链表 双向链表的定义 双向链表也叫双链表&#xff0c;与单向链表不同的是&#xff0c;每一个节点有三个区域组成&#xff1a;两个指针域&#xff0c;一个数据域 前一个指针域&#xff1a;存储前驱节点的内存地址后一个指针域&#xff1a;存储后继节点的内存地址数据域&a…

Beyond Compare和git merge、git rebase

文章目录 各个分支线将dev1 rebase进 dev2将dev1 merge进dev2 各个分支线 将dev1 rebase进 dev2 gitTest (dev2)]$ git rebase dev1local: 是rebase的分支dev1remote&#xff1a;是当前的分支dev2base&#xff1a;两个分支的最近一个父节点 将dev1 merge进dev2 gitTest (dev…

Qt应用开发(基础篇)——滑块类 Slider、ScrollBar、Dial

一、前言 滑块类QScrollBar、QSlider和QDial继承于QAbstractSlider&#xff0c;父类主要拥有最大值、最小值、步长、当前值、滑块坐标等信息&#xff0c;滑动的时候触发包含值数据变化、滑块按下、滑块释放等信号。键盘包括左/上和右/下箭头键通过定义的singleStep改变当前值&a…

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…

SpringBoot(九)jwt + 拦截器实现token验证

前面两篇文章的过滤器和拦截器&#xff0c;我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议&#xff0c;当用户访问一个后端接口时&#xff0c;如何判断该用户有没有权限&#xff1f;当然&#xff0c;可以使用账号密码去验证。但是&#xff0c;如果使用账号和…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程&#xff08;手把手教程&#xff09; 银河麒麟的各种离线全套安装教程&#xff1a; https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql&#xff08;mariadb&#xff09; 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

网络出口技术中的单一出口网络结构,你会用吗?

我们在设计一个园区网络的时候&#xff0c;园区网络的出口需要和运营商的网络进行对接&#xff0c;从而提供internet服务。 在和运营商网络对接的时候&#xff0c;一般采用如下3终方式&#xff1a; 单一出口网络结构 1、网络拓扑 终端用户接入到交换机&#xff0c;交换机直…

PostgreSQL-Centos7源码安装

卸载服务器上的pg13 本来是想删除原来的postgis重新源码安装就行,但是yum安装的PostgreSQL不能直接使用,会提示以下问题: 之前服务是用yum安装的,现在需要删除 -- 删除数据的postgis插件 drop extension postgis; drop extension postgis cascade;删除相关安装包 # 查询…

Linux安装操作(Mac版本)

Parallels Desktop的简介 Parallels Desktop是Mac平台上的虚拟机软件&#xff0c;也是Mac平台最好的虚拟机软件之一。它允许用户在Mac OS X系统上同时运行其他操作系统&#xff0c;例如Windows、Linux等。Parallels Desktop为Mac用户提供了使用其他操作系统和软件的便利性&…

shell脚本:使用mysqldump实现分库分表备份

一.什么是分库分表备份 分库分表备份是一种数据库备份策略&#xff0c;用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时&#xff0c;单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题&#xff0c;使用分库分表技术将数据库拆分成多个库…