C++STL容器(上)string/vector/deque/stack/queue/list

2023-10-27

数据结构:研究节点和节点之间的关系
STL(算法、容器、迭代器)实现了数据结构和算法的有效分离,用来管理元素。算法和迭代器可以进行无缝连接

count(v.begin(),v.end(),3)//统计元素3的个数
容器除了可以放基础数据类型,也可以放元素(类类型对象),也可以放指针类型,也可以放指针类类型对象【涉及深拷贝和浅拷贝】。
容器push_back()是将元素拷贝到容器中,所以要确保元素可以被复制,即如果是类对象的话拷贝构造函数。
容器分类:
序列式容器(Sequence containers)
每个元素都有固定位置--取决于插入时机和地点,和元素值无关。vector、deque、list  
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关 set、multiset、map、multimap

常用算法头文件:<algorithm>,<numeric>和<functional>

一、容器
1.string
1.1存取字符:operator[]和at()//主要区别在于at()在越界时会抛出异常,[]在刚好越界时会返回(char)0,再继续越界时,编译器直接出错。如果你的程序希望可以通过try,catch捕获异常,建议采用at()。
1.2 string转char*
const char *c_str() const;   //从string取得char* 返回一个以'\0'结尾的字符串的首地址
int copy(char *s, int n, int pos=0) const;  //把string拷贝到char*,s要分配内存
1.3长度
int length() const;   //返回当前字符串的长度。长度不包括字符串结尾的'\0'。
bool empty() const;     //当前字符串是否为空
1.4赋值
string &operator=(const string &s);//把字符串s赋给当前的字符串,s可以是const string &,const char *
string &assign(s); //把字符串s赋给当前的字符串,可以是const string &,const char *
string &assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
string &assign(int n,char c);  //用n个字符c赋给当前字符串
string &assign(const string &s,int start, int n);  //把字符串s中从start开始的n个字符赋给当前字符串
1.5比较
int compare(s) const;  //与字符串s比较,s可以是const string &,const char *
compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。
1.6字串
string substr(int pos=0, int n=npos) const;    //返回由pos开始的n个字符组成的子字符串
1.7查找与替换
查找
int find(char c,int pos=0) const;  //从pos开始查找字符c在当前字符串的位置 
int find(s, int pos=0) const;  //从pos开始查找字符串s在当前字符串的位置,s可以是const string &,const char *
int rfind(char c, int pos=npos) const;   //从pos开始从后向前查找字符c在当前字符串中的位置 
int rfind(s, int pos=npos) const;//npos最后一个位置
//rfind是反向查找的意思,如果查找不到, 返回-1
替换
string &replace(int pos, int n, s);//删除从pos开始的n个字符,然后在pos处插入串s
void swap(string &s2);    //交换当前字符串与s2的值
1.8区间删除和插入
string &insert(int pos, s);//前两个函数在pos位置插入字符串s
string &insert(int pos, int n, char c);  //在pos位置 插入n个字符c
string &erase(int pos=0, int n=npos);  //删除pos开始的n个字符,返回修改后的字符串
1.9算法
transform(起始位置,结束位置,目标起始地址,回调函数地址)//替换比如toUpper/toLower

2.Vector动态数组
2.1构造
vector采用模板类实现,vector对象的默认构造形式
vector<T> vecT; 
Class CA{};
vector<CA*> vecpCA;          //用于存放CA对象的指针的vector容器。
vector<CA> vecCA;         //用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。
带参数构造
vector(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
vector(n,elem);   //构造函数将n个elem拷贝给本身。
vector(const vector &vec);  //拷贝构造函数
2.2赋值
vector.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
vector.assign(n,elem);  //将n个elem拷贝赋值给本身。
vector& operator=(const vector  &vec);    //重载等号操作符
vector.swap(vec);  // 将vec与本身的元素互换。
2.3大小
vector.size();       //返回容器中元素的个数
vector.empty();       //判断容器是否为空
vector.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
vector.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
2.4末尾添加、移除
vecInt.push_back(1);  //在容器尾部加入一个元素
vecInt.pop_back();//移除
2.5数据存取 
vec.at(idx);      //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
vec[idx];      //返回索引idx所指的数据,越界时,运行直接报错
2.6插入
vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值
2.7删除
vector.clear();    //移除容器的所有数据
vec.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
vec.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
//这样程序会跑宕,因为最初没有分配内存直接赋值会出错,将第一句定义改为vector<int> vec(10);ok
2.8迭代器
正向遍历:
for(vector<int>::iterator it=vecInt.begin(); it!=vecInt.end(); ++it)
{
      int iItem = *it; 
      cout << iItem;    //或直接使用  cout << *it;
}
//存储Teacher类指针类型元素
for(vector<Teacher*>::iterator it=vecInt.begin(); it!=vecInt.end(); ++it)
{
      
      cout << (*it)->age;    //访问指针类类型元素的方式(*it)->age.
}
逆向+r
2.9删除指定元素
for(vector<int>::iterator it=vecInt.begin(); it!=vecInt.end(); )
{
      if(*it==2)
          it=v1.erase(it);
//当删除迭代器所指向的元素的时候,erase删除函数会让it自动向下移动,所以只在不等的时候++,返回一个迭代器的位置,所以要用新的it接住
      else
          it++;
}

2.10 宕机实例
vector<int> vec;
for(int i=0;i<10;i++)
    vec[i]=i+1;


3.deque双端数组
3.1头部和末尾的添加移除
deque.push_back(elem);    //在容器尾部添加一个数据
deque.push_front(elem);    //在容器头部插入一个数据
deque.pop_back();            //删除容器最后一个数据
deque.pop_front();        //删除容器第一个数据
3.2大部分基本操作与vector相同
数据存取、迭代器、赋值、带参构造函数、大小、插入、删除与vector相同
3.3根据迭代器求数组下标
#include <deque>
#include <algorithm>
deque<int>::it=find(d1.begin(),d1.end(),-33);
if(it!=d1.end())
     cout<<"-33的下标是"<<distance(d1.begin(),it)<<endl;//diatance函数计算两个迭代器之间的距离
else
    cout<<"未找到值为-33的元素"<<endl;

4.stack容器

4.1默认构造
stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT;  
4.2push和pop
stack.push(elem);   //往栈头添加元素
stack.pop();   //从栈头移除第一个元素
4.3拷贝构造和赋值
stack(const stack &stk);             //拷贝构造函数
stack& operator=(const stack &stk);    //重载等号操作符
4.4获取栈顶元素
stack.top();      //返回最后一个压入栈元素
4.5大小
stack.empty();   //判断堆栈是否为空
stack.size();          //返回堆栈的大小

5.queue
5.1默认构造
   queue采用模板类实现,queue对象的默认构造形式:queue<T> queT;  
5.2push与pop
   queue.push(elem);   //往队尾添加元素
   queue.pop();   //从队头移除第一个元素
5.3拷贝构造与赋值
   queue(const queue &que);             //拷贝构造函数
   queue& operator=(const queue &que);    //重载等号操作符
5.4back和front
queue.back();   //返回最后一个元素
queue.front();   //返回第一个元素
5.5大小
  queue.empty();   //判断队列是否为空
queue.size();          //返回队列的大小


6.List容器 双向链表容器
 6.1简介
  可以高效的进行插入删除元素,不可以随机存取元素所以不支持at(pos)函数,支持it++,it--但不支持it+5
 6.2头尾的添加移除
  list.push_back(elem);       //在容器尾部加入一个元素
list.pop_back();              //删除容器中最后一个元素
list.push_front(elem);     //在容器开头插入一个元素
list.pop_front();              //从容器开头移除第一个元素
6.3数据存取
list.front();   //返回第一个元素。
list.back();  //返回最后一个元素。
6.4带参构造函数
  list(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
list(n,elem);   //构造函数将n个elem拷贝给本身。
list(const list &lst);  //拷贝构造函数。
6.5赋值
list.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
list.assign(n,elem);  //将n个elem拷贝赋值给本身。
list& operator=(const list &lst);    //重载等号操作符
list.swap(lst);  // 将lst与本身的元素互换。

6.6大小
list.size();       //返回容器中元素的个数
list.empty();       //判断容器是否为空
list.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
list.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
6.7插入
list.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
list.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
list.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。
6.8删除
list.clear();        //移除容器的所有数据
list.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
list.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
lst.remove(elem);   //删除容器中所有与elem值匹配的元素。
6.9反序排列
lst.reverse();     //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++STL容器(上)string/vector/deque/stack/queue/list 的相关文章

随机推荐

  • SpringBoot集成Swagger3并配合knife4j增强文档

    前提 knife4j自带swagger依赖 不需要再引入其他swagger依赖 如果要使用 swagger spring boot starter 依赖 则knife4j必须和swagger的版本相对应 官方文档 版本对应关系 1 引入依赖
  • 【时序】特征工程-时间序列特征构造

    数据和特征决定了机器学习的上限 而模型和算法只是逼近这个上限而已 由此可见 特征工程在机器学习中占有相当重要的地位 在实际应用当中 可以说特征工程是机器学习成功的关键 特征工程是什么 特征工程是利用数据领域的相关知识来创建能够使机器学习算法
  • bandgap-ldo联合仿真

    具体电路可参考前面两篇文章 bandgap电路设计与LDO电路设计 本文是将上篇LDO电路的理想电流源用bandgap电路代替 实现完整的LDO电路 1 仿真测试电路 电源电压3V 误差放大器输入级VREF电压由bandgap电路提供 5u
  • 442、数组中重复的数据

    文章目录 一 题目描述 二 题目分析 三 代码实现 四 总结 一 题目描述 442 数组中重复的数据 给你一个长度为 n 的整数数组 nums 其中 nums 的所有整数都在范围 1 n 内 且每个整数出现 一次 或 两次 请你找出所有出现
  • docker 启动,关闭,查看运行状态

    启动docker systemctl start docker 关闭docker systemctl stop docker 查看docker的运行状态 systemctl status docker root izr86o15kikb3a
  • 目标跟踪学习笔记

    参考 https zhuanlan zhihu com p 90835266 真心感觉目标跟踪任务的难度和复杂度要比分类和目标检测高不少 具有更大的挑战性 如果你跟我一样是正在学习目标跟踪的新手 希望本文能让你对目标跟踪任务和DeepSOR
  • 基于Matlab实现图像压缩技术(附上完整源码+图像+程序运行说明)

    介绍 图像压缩是一种将图像数据压缩以减小文件大小的技术 在数字图像处理中 图像通常以像素阵列的形式表示 对于大型图像文件 传输和存储成本可能很高 因此图像压缩技术变得至关重要 在本文中 我们将介绍一种使用Matlab实现图像压缩的技术 图像
  • 通过L-evy飞行进行布谷鸟搜索

    英文 Cuckoo Search via L evy Flights 在本文中 我们打算制定一种新的元启发式算法 称为布谷鸟搜索 CS 用于解决优化问题 这个算法是基于一些布谷鸟物种的强制性的幼虫寄生行为与一些鸟类和果蝇的L evy飞行行为
  • Python webdriver.Chrome()的使用

    1 前提 Python与Chrome路径下均安装chromedriver exe 2 chromedriver exe版本选择及下载 下载地址为 http npm taobao org mirrors chromedriver Chrome
  • Mybatis中使用${}和使用#{}

    Mybatis中 和 的区别 1 使用 2 使用 3 总结 印象中一直认为使用Mybatis肯定能防止sql注入 前两天才发现我太天真了 防止sql注入也是有条件的 这我们就要了解下Mybatis中 和 的使用了 1 使用 Mybatis在
  • Ajax请求返回状态码415

    1 ajax请求服务器报415错误多半是ajax的请求格式不对 服务器不支持此媒体类型 那么 此时你首先小检查自己的ajax的格式是否正确 在就是传递的参数类型是否是正确的 传递给服务器的参数也要根据后台的要求设置 有时传递一个对象 但有时
  • UVA-10976 分数拆分 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 除了书上讲的y lt 2k之外 y gt k 否则等式不可能成立 include
  • Hibernate @OneToOne FetchType.LAZY不生效

    在Hibernate中 提供了懒加载功能 当需要的时候才查询具体数据 但是在使用 OneToOne关系时 FetchType LAZY看起来不会生效 当你查询一个实体类A 这个实体类A持有另一个实体类B的引用 但是A中并没有记录B的主键 这
  • 怎样正确安装超声波水位计?

    1 应保持仪表垂直安装 在安装超声波液位计时 要保证换能器的发射面和被测的平面平行 这样可以保证垂直发射到被测物体表面的声波以最大的能量返回 2 实际安装时 如果现场工况有蒸汽 易有水珠附着在探头表面 并且探头的量程比实际要测量的距离大很多
  • Python 调用 WebService

    最近做新项目用 Python 开发 作为初学者 遇到了不少问题 客户端的一个模块要调用公司网站的一些新闻 只好用 WebService 实现 WebService 搭建我就不说了 这里主要说在 Python 调用 WebService 的方
  • BGP-路由反射器、联邦实验(1.11)

    目标 1 首先需要基于该与拓扑图对172 16 0 0 16进行子网划分 题中一共需要八个网段的环回和一个骨干链路共8个网段 172 16 0 0 20 骨干 再分为八个 172 16 0 0 30 172 16 0 4 30 172 16
  • java去重复元素并打印_Java打印数组中重复元素

    Java打印数组中重复元素 1 说明 在此程序中 我们需要打印数组中存在的重复元素 这可以通过两个循环来完成 第一个循环将选择一个元素 第二个循环将通过将所选元素与其他元素进行比较来遍历整个数组 如果找到匹配项 则打印重复的元素 在上面的数
  • 仙道服务器维护,【正式服】2月14日例行更新维护公告

    为了给您提供更优质的游戏体验 诛仙手游 正式服 将于2月14日7 00 9 00进行例行维护 如遇特殊情况 开机时间将会顺延 本次更新后 等级 30级的玩家将通过邮件收到200绑定元宝更新补偿奖励 情人节特别活动 1 执子之手 与子同秀 活
  • 【面试】面试官:src和href的区别

    1 请求资源类型不同 1 href是Hypertext Reference的缩写 表示超文本引用 用来建立当前元素和文档之问的链接 常用的有 link a 2 在请求 src 资源时会将其指向的资源下载并应用到文档中 常用的有script
  • C++STL容器(上)string/vector/deque/stack/queue/list

    数据结构 研究节点和节点之间的关系 STL 算法 容器 迭代器 实现了数据结构和算法的有效分离 用来管理元素 算法和迭代器可以进行无缝连接 count v begin v end 3 统计元素3的个数 容器除了可以放基础数据类型 也可以放元