c++学习:STL库(框架)+字符串模板类string+vector容器+list链表

news2024/11/13 9:31:14

目录

stl库

常用组件包括

字符串库  字符串模板类string

头文件

最常用的字符串模板类

 字符串类型

模板原型

模板的成员数据类型

模板成员函数

有些函数会有重载,可以去下面网址查看std::basic_string - cppreference.comhttps://zh.cppreference.com/w/cpp/string/basic_string

定义字符串模板对象

字符串实战  部分成员函数和非成员函数

vector容器   动态数组类模板

头文件

模板原型

模板的成员数据类型和成员函数

定义动态数组类模板对象

容器实战

简单的学生管理系统

list双向链表

头文件

模板原型

模板得成员数据类型和成员函数

实战


stl库

STL是指标准模板库,提供了通用的模板类和函数,可以实现多种流行和常用的算法和数据结构,例如字符串操作,链表,队列等等

常用组件包括

  • 容器(顺序容器,关联容器)
    • 例如数组,链表,栈,二叉树等等
  • 算法 
    • 作用于容器,提供操作方法,初始化,排序,搜索,转换等等
  • 迭代器
    • 遍历对象集合的元素,类似指针

字符串库  字符串模板类string

头文件

#include <string>

最常用的字符串模板类

  • std::basic_string
    • 为操作任何字符串类型的字符串设计的模板类

 字符串类型

  • 类型                                          定义
  • std::string                                  std::basic_string<char>
  • std::wstring                                std::basic_string<wchar_t>
  • std::u8string (C++20 起)            std::basic_string<char8_t>
  • std::u16string (C++11 起)          std::basic_string<char16_t>
  • std::u32string (C++11 起)          std::basic_string<char32_t>

模板原型

template<
    class CharT,//字符串类型
    class Traits = std::char_traits<CharT>,//指定字符串类型上操作的特性类
    class Allocator = std::allocator<CharT>//用于分配内存存储的分配器类型
>class basic_string;

模板的成员数据类型

成员类型定义
traits_typeTraits
value_typeCharT
allocator_typeAllocator
size_type
Allocator::size_type
std::allocator_traits<Allocator>::size_type
difference_type
Allocator::difference_type
std::allocator_traits<Allocator>::difference_type
referencevalue_type&
const_referenceconst value_type&
pointer
Allocator::pointer
std::allocator_traits<Allocator>::pointer
const_pointer
Allocator::const_pointer
std::allocator_traits<Allocator>::const_pointer
iterator

指向 value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 及老式连续迭代器 (LegacyContiguousIterator)

指向 value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 、contiguous_iterator 及常量表达式迭代器 (ConstexprIterator)

const_iterator

指向 const value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 及老式连续迭代器 (LegacyContiguousIterator)

指向 const value_type 的老式随机访问迭代器 (LegacyRandomAccessIterator) 、contiguous_iterator 及常量表达式迭代器 (ConstexprIterator)

reverse_iteratorstd::reverse_iterator<iterator>
const_reverse_iteratorstd::reverse_iterator<const_iterator>

模板成员函数

成员函数
(构造函数)    构造 basic_string(公开成员函数)
(析构函数)    销毁字符串,在使用内部存储时解分配它(公开成员函数)
operator=    为字符串赋值(公开成员函数)
assign    赋值字符给字符串(公开成员函数)
assign_range    赋值范围内的字符到字符串(公开成员函数)
get_allocator    返回关联的分配器(公开成员函数)

元素访问
at    访问指定字符,有边界检查(公开成员函数)
operator[]    访问指定字符(公开成员函数)
front    访问首字符(公开成员函数)
back    访问最后的字符(公开成员函数)
data    返回指向字符串首字符的指针(公开成员函数)
c_str    返回字符串的不可修改的 C 字符数组版本(公开成员函数)
operator basic_string_view    返回到整个字符串的不可修改的 basic_string_view(公开成员函数)

迭代器
begin、cbegin    返回指向起始的迭代器(公开成员函数)
end、cend    返回指向末尾的迭代器(公开成员函数)
rbegin、crbegin    返回指向起始的逆向迭代器(公开成员函数)
rend、crend    返回指向末尾的逆向迭代器(公开成员函数)

容量
empty    检查字符串是否为空(公开成员函数)
size、length    返回字符数(公开成员函数)
max_size    返回字符数的最大值(公开成员函数)
reserve    保留存储(公开成员函数)
capacity    返回当前对象分配的存储空间能保存的字符数量(公开成员函数)
shrink_to_fit    通过释放不使用内存减少内存使用(公开成员函数)

操作
clear    清除内容(公开成员函数)
insert    插入字符(公开成员函数)
insert_range    插入范围内的字符(公开成员函数)
erase    移除字符(公开成员函数)
push_back    后附字符到结尾(公开成员函数)
pop_back    移除末尾字符(公开成员函数)
append    后附字符到结尾(公开成员函数)
append_range    后附范围内的字符到结尾(公开成员函数)
operator+=    后附字符到结尾(公开成员函数)
compare    比较二个字符串(公开成员函数)
starts_with    检查字符串是否始于给定前缀(公开成员函数)
ends_with    检查字符串是否终于给定后缀(公开成员函数)
contains    检查字符串是否含有给定的子串或字符(公开成员函数)
replace    替换字符串的指定部分(公开成员函数)
replace_with_range    以范围中的字符替换字符串的指定部分(公开成员函数)
substr    返回子串(公开成员函数)
copy    复制字符(公开成员函数)
resize    更改存储的字符数(公开成员函数)
resize_and_overwrite    更改存储的字符数并可能经由用户提供的操作重写不确定的内容(公开成员函数)
swap    交换内容(公开成员函数)

查找
find    于字符串中寻找字符(公开成员函数)
rfind    寻找子串的最后一次出现(公开成员函数)
find_first_of    寻找字符的首次出现(公开成员函数)
find_first_not_of    寻找字符的首次缺失(公开成员函数)
find_last_of    寻找字符的最后一次出现(公开成员函数)
find_last_not_of    寻找字符的最后一次缺失(公开成员函数)

有些函数会有重载,可以去下面网址查看std::basic_string - cppreference.comicon-default.png?t=N7T8https://zh.cppreference.com/w/cpp/string/basic_string

定义字符串模板对象

#include <string>

using namespace std;

int main()
{
    //实例化一个STL库中的字符串类模板的对象
    std::basic_string<char>  s1;
    basic_string<char>  s2;
    std::string  s3;
    string s4;
}

上面的s1,s2,s3,s4定义其实都是一样的,c++为了方便,将std::basic_string<char>另起名为std::string

typedef std::basic_string<char> std::string;

字符串实战  部分成员函数和非成员函数

#include <iostream>
#include <string>

using namespace std;

int main()
{
    //实例化一个STL库中的字符串类模板的对象
    std::basic_string<char>  s1;
    basic_string<char>  s2;
    std::string  s3;
    string s4;

    //构造
    string s5("hello world");
    //赋值重载=
    s4 = s5;
    //元素访问,返回引用
    cout<<s4.at(1)<<endl;
    s4.at(0) = 'x';
    //赋值重载[]
    s4[2] = 'p';
    //赋值重载<<
    cout<<s4<<endl;

    //data返回的是  string转化为的const char*指针
    //返回指向字符串首字符的指针
    cout<<"s5:"<<s5.data()<<endl;
    //返回字符串的不可修改的 C 字符数组版本
    cout<<"s5:"<<s5.c_str()<<endl;

    //通过迭代器 遍历 容器中的每个元素
    //begin返回字符串首字符的迭代器 数据类型是iterator 
    //end返回字符串最后字符的迭代器 数据类型是iterator 
    //iterator在类模板里  正常写法是std::basic_string<char>::iterator 
    for(string::iterator it=s5.begin();it!=s5.end() ;it++)
    {
        cout<<*it<<endl;
    }

    //容量
    //判断是否为空,返回blue类型
    string s6;
    if(s6.empty())
    {
        cout<<"s6.empty"<<endl;
    }
    //capacity返回当前这个对象里面的指针成员 指向的堆空间,能够容纳存储多少个字符
    cout<<s6.capacity()<<endl;

    //size、length当前这个对象中有效的字符串的长度
    cout<<"size:"<<s6.size()<<endl;
    cout<<"length:"<<s6.length()<<endl;

    //插入操作
    string s77("nihao");
    s77.insert(2,1,'a');
    cout<<s77<<endl;//niahao
    //尾插法
    //nihao---->nihao,zaime
    //push_back只能插一个字符
    string s7("nihao");
    s7.push_back(',');
    s7.push_back('z');
    s7.push_back('a');
    s7.push_back('i');
    s7.push_back('m');
    s7.push_back('e');
    cout<<s7<<endl;

    //尾部删除删除
    s7.pop_back();
    cout<<s7<<endl;

    //append追加
    string s8("hello");
    s8.append(" world");
    cout<<s8<<endl;
    //赋值重载+=
    s8 += "123456";
    cout<<s8<<endl;

    //返回子串
    //要求 将 s8("hello world123456")-->将world返回来
    cout<<s8.substr(6,5)<<endl;

    //查找
    string s9("abc123456efg");
    //想要在上面的字符串中查找 是否存在123456
    int ret = s9.find("www");
    //如果找到了,则返回 子串的起始位置 int ,没有找到返回 -1
    cout<<ret<<endl;


    //以下是类的  非成员函数 ,不能通过对象进行调用
    string s10("hello");
    if(s10 == "hello") //等同于调用operator==(s10,"hello")
    {

    }

    string s11("123456");
    //将string 转换成 int
    int val = std::stoi(s11);

    //将整型 100转换成 string
    int data = 100;
    string s12 = std::to_string(data);
    cout<<s12<<endl;

    return 0;
}

vector容器   动态数组类模板

std::vector是封装动态数组的顺序容器,简单来说就是动态数组类模板

头文件

#include<vector>

模板原型

template<
    class T,//元素的类型
    class Allocator = std::allocator<T>//用于获取/释放内存及构造/析构内存中元素的分配器
> class vector;

模板的成员数据类型和成员函数

std::vector - cppreference.comicon-default.png?t=N7T8https://zh.cppreference.com/w/cpp/container/vector

定义动态数组类模板对象

    std::vector<int> v1(10);

容器实战

#include <iostream>
#include <vector>

using namespace std;

//ostream& operator<<(ostream&out, std::vector<int> &ra)
//{
//    for(int i=0; i<ra.size(); i++)
//    {
//        out<<ra.at(i)<<"\t";
//    }
//}

int main()
{
    //实例化一个STL库中的动态数组类模板的对象
    //注意:如果实例化vector类对象的时候,没有指定元素的个数
    //那么,容器里面默认的大小为0,也就是没有空间
    std::vector<int> v1(10);

    for(int i=0; i<10; i++)
    {
        //v1.at(i) = i+100;
        v1[i] = i+10;
    }

    //编译器 会转换 成 运算符函数 operator<<(cout,v1)需要自己定义
    //cout<<v1<<endl; 
    
    //返回首元素指针
    int *arr = v1.data();

    //通过迭代器遍历容器
    //正向迭代器  需要将运算符函数 operator<<注释掉,要不然测不出来
    std::vector<int>::iterator  it;
    for(it=v1.begin(); it!=v1.end(); it++){
        cout<<*it<<"\t";
    }
    cout<<endl;

    //反向迭代器遍历容器
    std::vector<int>::reverse_iterator rit;
    for(rit = v1.rbegin(); rit!=v1.rend(); rit++)
    {
        cout<<*rit<<"\t";
    }cout<<endl;

    //尾插 并且 会给你进行扩容
    v1.push_back(1000);
    //遍历查看
    for(it=v1.begin(); it!=v1.end(); it++){
        cout<<*it<<"\t";
    }cout<<endl;

    return 0;
}

简单的学生管理系统

#include <iostream>
#include <vector>

using namespace std;

struct Student{
    string name;
    int age;
    float score;
};

int main()
{
    std::vector<struct Student> v;

    struct Student s1 = {"zhang3",22,100};
    v.push_back(s1);

    struct Student s2 = {"zhang4",22,100};
    v.push_back(s2);

    struct Student s3 = {"zhang5",22,100};
    v.push_back(s3);

    for(std::vector<struct Student>::iterator it=v.begin(); it!=v.end(); it++)
    {
        cout<<"name:"<<it->name<<" age:"<<it->age<<" score:"<<it->score<<endl;
    }

    return 0;
}

list双向链表

头文件

 #include<list>

模板原型

template<
    class T,//元素的类型
    class Allocator = std::allocator<T>//用于获取/释放内存及构造/析构内存中元素的分配器
> class list;

模板得成员数据类型和成员函数

std::list - cppreference.comicon-default.png?t=N7T8https://zh.cppreference.com/w/cpp/container/list

实战

#include <iostream>
#include <list>

using namespace std;

class Student
{ 
public:
    Student(string n,int a,float s):name(n),age(a),score(s){}

    void show()
    {
        cout<<name<<"\t"<<age<<"\t"<<score<<endl;
    }
private:
    string name;
    int age;
    float score;
};



int main()
{

    //实例化一个双向链表容器的对象
    std::list<int> list1;

    //尾插
    list1.push_back(10);
    list1.push_back(20);
    list1.push_back(30);
    list1.push_back(40);
    list1.push_back(50);

    // 使用[]+ 下标的方式 访问 容器,一般来说,这个容器的每个元素的内存空间一定是连续的
    // int arr[3];    arr[2]等同于*(arr+2)
    //list1[0] =  1000;  错误 ,链表的内存空间不是连续的,不能使用 [ ]

    //迭代器遍历
    std::list<int>::iterator it;
    for(it=list1.begin(); it!=list1.end(); it++)
    {
        cout<<*it<<"\t";
    }cout<<endl;

    //学生信息
    std::list<Student> list;
    list.push_back(Student("zhang3",22,100));
    list.push_back(Student("zhang4",25,100));
    list.push_back(Student("zhang5",26,100));
    list.push_back(Student("zhang6",27,100));

    std::list<Student>::iterator it;
    for(it=list.begin(); it!=list.end(); it++)
    {
        it->show();
    }

    return 0;
}

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

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

相关文章

【python、pytorch】

什么是Pytorch Pytorch是一个基于Numpy的科学计算包&#xff0c;向它的使用者提供了两大功能。作为Numpy的替代者&#xff0c;向用户提供使用GPU强大功能的能力。做为一款深度学习的平台&#xff0c;向用户提供最大的灵活性和速度。 基本元素操作 Tenors张量&#xff1a;张量…

鸿蒙设备-开发板基础学习(BearPi-HM Micro)

theme: minimalism 每当学习一门新的编程语言或者上手一款新的开发板&#xff0c;在学习鸿蒙设备开发过程中&#xff0c;带大家写的第一个程序&#xff0c;通过这个程序&#xff0c;我们可以对鸿蒙设备开发的整个流程有一个初步的体验。BearPi-HM Micro开发板为例&#xff1a;…

127基于matlab的卡尔曼滤波在目标跟踪中应用仿真研究

基于matlab的卡尔曼滤波在目标跟踪中应用仿真研究&#xff0c;模拟目标真实轨迹 z&#xff0c;形成观测数据&#xff08;真实轨迹位置数据迭加上观测数据&#xff09; &#xff0c; 递推估计 &#xff0c;计算估计误差画出目标轨迹、测量数据、滤波数据曲线&#xff1b;滤波误差…

FPGA状态机学习

Verilog 是硬件描述语言&#xff0c;硬件电路是并行执行的&#xff0c;当需要按照流程或者步骤来完成某个功能时&#xff0c;代码中通常会使用很多个 if 嵌套语句来实现&#xff0c;这样就增加了代码的复杂度&#xff0c;以及降低了代码的可读性&#xff0c;这个时候就可以使用…

网络安全复习--简答整理

-----------------------------------------------------教材如上图------------------------------------------------------------ 1.对称加密和非对称加密各有什么特点&#xff1f;加密解密过程中有什么区别&#xff1f;优点P38【考】 对称加密的特点&#xff1a;在针对同一…

Android14之解决刷机报错:Can not load Android system. Your data may be corrupt(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

开启Android学习之旅-1

最近在学习《第一行代码 Android》&#xff0c;两天看书把所有代码都敲了一遍。由于之前没有接触过 Kotlin&#xff0c;导致了囫囵吞枣&#xff0c;跟着书会敲&#xff0c;离开就忘了。Android 大佬开发的各种框架、控件好像大部分都用了 Kotlin。看他们的源码&#xff0c;理解…

爬虫瑞数5案例:某通信

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、瑞数简介 瑞数动态安全 Botgate&#xff08;机器人防火墙&#xff09;以“动态安全”技术为核心&#xff0c;通过动态封装…

Javaweb之Mybatis的动态SQL的详细解析

3. Mybatis动态SQL 3.1 什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面…

4.7 MEMORY AS A LIMITING FACTOR TO PARALLELISM

虽然CUDA寄存器和共享内存在减少对全局内存的访问次数方面非常有效&#xff0c;但必须注意保持在这些内存的容量范围内。这些内存是线程执行所需的资源形式。每个CUDA设备提供有限的资源&#xff0c;从而限制了给定应用程序可以同时驻留在SM中的线程数量。通常&#xff0c;每个…

第11章 GUI Page480~486 步骤二十七 “脏数据”与“新文档”状态维护

wxMyPainterFrame类定义中声明新的成员&#xff1a; 增加一个全局变量&#xff0c;初始化新成员&#xff1a; 先实现TrySaveFile() SaveFile()暂时为空实现 增加两个新的私有成员方法&#xff1a; wxMyPainterFrame类中&#xff0c;修改了“_items”的几个地方 ① 鼠标抬起时…

设计模式的艺术P1基础—2.3 类之间的关系

设计模式的艺术P1基础—2.3 类之间的关系 在软件系统中&#xff0c;类并不是孤立存在的&#xff0c;类与类之间存在各种关系。对于不同类型的关系&#xff0c;UML提供了不同的表示方式 1&#xff0e;关联关系 关联&#xff08;Association&#xff09;关系是类与类之间最常用…

属性动画的使用

文章目录 1 概述2 创建属性动画页面3 属性动画参数调整延时播放时间delay的设置onFinish回调函数的使用 4 关闭属性动画页面5 参考 1 概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; …

代码随想总结

1. 刷题技能成长 之前跟着代码随想录刷过一段时间&#xff0c;但是因为是自己刷不知道每天该刷几道题&#xff0c;而且没有组织的坚持异常困难&#xff0c;第一次在刷完链表之后&#xff0c;就逐渐停滞不前&#xff0c;十一月份看到了代码随想录的训练营&#xff0c;纠结要不要…

配置git服务器

第一步&#xff1a; jdk环境配置 &#xff08;1&#xff09;搜索【高级系统设置】&#xff0c;选择【高级】选项卡&#xff0c;点【环境变量】 &#xff08;2&#xff09;在【系统变量】里面&#xff0c;点击【新建】 &#xff08;3&#xff09;添加JAVA_HOME环境变量JAVA_HO…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

基于zookeeper实现服务节点HA主备自动切换

文章目录 前言一、架构图和流程图二、流程说明1.服务启动初始化ZK、注册所有服务节点信息-MasterRegister2.创建、运行服务节点&#xff0c;并管理服务节点-LeaderSelectorZkClient。3.典型场景-调度服务单体执行-DigitalEmpTask 总结参考 前言 Spring Boot 主备切换可以采用数…

mac电脑php命令如何设置默认的php版本

前提条件&#xff1a;如果mac电脑还没安装多个PHP版本&#xff0c;可以先看这篇安装一下 mac电脑运行多个php版本_mac 同时运行两个php-CSDN博客 第一部分&#xff1a;简单总结 #先解除现在默认的php版本 brew unlink php7.4#再设置的想要设置的php版本 brew link php8.1第二部…

python 多线程 守护线程

daemon线程&#xff1a;守护线程&#xff0c;优先级别最低&#xff0c;一般为其它线程提供服务。通常&#xff0c;daemon线程体是一个无限循环。如果所有的非daemon线程(主线程以及子线程&#xff09;都结束了&#xff0c;daemon线程自动就会终止。t.daemon 属性&#xff0c;设…

一、MOJO环境部署和安装

以Ubuntu系统为例。 安装mojo-CLI curl https://get.modular.com | MODULAR_AUTHmut_fe303dc5ca504bc4867a1db20d897fd8 sh - 安装mojo SDK modular auth mojo modular auth install mojo 查看mojo版本号 mojo --version 输入mojo指令&#xff0c;进入交互编程窗口