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

目录

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");//想要在上面的字符串中查找 是否存在123456int ret = s9.find("www");//如果找到了,则返回 子串的起始位置 int ,没有找到返回 -1cout<<ret<<endl;//以下是类的  非成员函数 ,不能通过对象进行调用string s10("hello");if(s10 == "hello") //等同于调用operator==(s10,"hello"){}string s11("123456");//将string 转换成 intint val = std::stoi(s11);//将整型 100转换成 stringint 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.mzph.cn/news/608841.shtml

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

相关文章

1.8 day6 IO进程线程

使用有名管道实现两个进程之间的通信 进程A #include <myhead.h> int main(int argc, const char *argv[]) {//创建两个文件描述符用于打开两个管道int fd1-1;int fd2-1;//创建一个子进程int pid-1;if((fd1open("./mkfifo1",O_RDWR))-1){perror("open er…

STM32-04-STM32时钟树

STM32时钟树 什么是时钟&#xff1f; 时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。&#xff08;时钟是单片机的脉搏&#xff0c;搞懂时钟走向及关系&#xff0c;对单片机使用至关重要&#xff09;。 时钟树 时钟源 2个外部时钟源 高速外部振荡器(HSE…

教你如何将本地虚拟机变成服务器,供其它电脑访问

场景&#xff1a;最近在做数据仓库的作业&#xff0c;需要团队协作&#xff0c;买不起阿里云服务器&#xff0c;所以想到能不能将我本地机上的虚拟机变成服务器&#xff0c;供其它同学的电脑访问。在虚拟机上安装hadoop和hive&#xff0c;然后同学机子上安装kettle进行连接。最…

离线安装jenkins:使用rpm安装包

目录 一、安装jdk1.8二、安装yum软件包三、下载rmp安装包四、安装jenkins的rpm安装包五、创建jenkins文件目录六、设置环境变量七、配置jdk位置八、配置Jenkins配置文件九、启动Jenkins十、访问Jenkins十一、安装Jenkins插件 一、安装jdk1.8 根据博客Linux操作系统安装jdk1.8并…

实战经验分享,Python 连接 Oracle 踩坑实录

最近的一个测试任务需要测试 oracle 同步 hive 数据库的性能&#xff0c;那就需要对 oracle 数据库灌注测试数据。我就又打开了我的IDE&#xff0c;准备把我之前一下可以灌50w数据到 MySQL 的代码&#xff0c;改一改&#xff0c;直接用。 因为我在网上看到&#xff0c;语法上也…

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

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

MVC设计模式和与三层架构的关系

MVC设计模式和与三层架构的关系 MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为数据承载Bean&#x…

用C语言实现动态数组Vector

代码仓库地址 1. 动态数组原理 定义一个结构体类型&#xff0c;在结构体中用指针指向一个在堆空间开辟的一块内存。 2. 编写头文件 在头文件里定义Vector的数据结构和相关操作&#xff0c;可以通过修改 “typedef char* Element;” 来修改存储的数据的类型&#xff1b; #ifn…

歌手荆涛演唱的春节回家:传统与现代的交织,歌声里的乡愁与期盼

随着冬日渐寒&#xff0c;春节的脚步愈发临近。这是一个充满温馨与期待的时刻&#xff0c;一个穿越时空、凝聚亿万华夏儿女情感的盛大节日。春节&#xff0c;它不仅仅是一个传统习俗的展现&#xff0c;更是一种心灵的归宿&#xff0c;一种文化的传承。 在悠久的历史长河中&…

Selenium 学习(0.18)——软件测试之基本路径测试

1、基本路径法测试的概念 是一种白盒测试方法&#xff0c;它在程序控制流图的基础上&#xff0c;通过分析控制构造的环行复杂性&#xff0c;导出基本可执行路径集合&#xff0c;从而设计测试用例的方法。 要保证在测试中程序的每一个可执行语句至少执行一次 【这和语句…

很有用!小企业如何从零开始制作产品手册?

对于初创公司和小企业来说&#xff0c;创造一份高效、吸引人的产品手册可能不是特别简单&#xff0c;特别是当资源和预算有限的时候。然而&#xff0c;一份良好的产品手册可以帮助你传达你的品牌故事&#xff0c;展示你的产品&#xff0c;甚至可以帮助你提高销售额&#xff0c;…

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一&#xff0c;由于神经网络的发展&#xff0c;曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成&#xff0c;人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…

【仙丹秘法】如何炼制一颗稳定的仙丹

提示词始终保持不变 1&#xff1a;收集素材 制作lora_v1 2: 制作lora_v1 产生 1个人物 含 你想要的服装 导入 pose_1 到 control 1 生成人物 (white_background:1.1),front view,1boy,blue sleeveless t-shirt,blue shorts,detailed eyes,best quality,masterpiece,high res…

第三站:C/C++基础-二维数组

二维数组的概念 一维数组本身是多个大小相同的内存块,从0开始逐渐递增所组成的在横向上的有序"组合", 二维数组就是很多个一维数组在纵向上的组合,每一个一维数组就是二维数组在纵向上的从0开始的逐渐递增的一个单位,(所以一维数组在二维数组的基础上,每一个内存块…

Spring 基于注解的AOP见解4

5.基于注解的AOP配置 5.1创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

SUDA-计算机网路-期末复习提纲

写在前面 帮苏大的同学整理的计网复习材料&#xff0c;用的是他们老师划定的范围。 1.负责互联网协议开发、标准制定、地址分配的国际组织名称及其主要职责 (1) 地址支持组织&#xff08;ASO&#xff09;负责IP地址系统的管理。 (2) 域名支持组织&#xff08;DNSO&#xff09;…

LeetCode(242)有效的字母异位词⭐

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输…

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型&#xff1a;UPOCR1.1、为什么提出UPOCR&#xff1f;1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何&#xff1f; 二、OCR大一统模型前…

kdump安装及调试策略

本文基于redhat系的操作系统&#xff0c;debian系不太一样&#xff0c;仅提供参考 1.kdump的部署 注&#xff1a;一般很多操作系统在安装时可默认启动kdump。 &#xff08;1&#xff09;需要的包 yum install kexec-tools crash kernel-debuginfo &#xff08;2&#xff0…

《堆排序》与《Top—k》

目录 ​编辑 前言&#xff1a; 关于《堆排序》&#xff1a; 第一步&#xff1a;建堆 第二步&#xff1a;排序 《Top—K问题》 关于Top—k问题&#xff1a; 前言&#xff1a; 我们在前面的blog中&#xff0c;对于《堆》已经有了初步的概念&#xff0c;那么接下来我们可以…