首页 > 编程语言 >算法笔记的笔记——第6章 C++标准模板库(STL)

算法笔记的笔记——第6章 C++标准模板库(STL)

时间:2023-03-22 18:23:29浏览次数:66  
标签:vector set 迭代 STL 元素 C++ erase 笔记 first

vector

  • 变长数组
  • 长度根据需要而自动改变的数组
  • 可以用来以邻接表的方式储存图

使用

  • 头文件:#include <vector>
  • 命名空间:using namespace std;

定义

vector<typename> name;

相当于一维数组name[SIZE],但长度可变。typename可以为任何类型,例如intdoublechar、结构体登,也可以是STL标准容器,如vectorsetqueue等。如果typename也是一个STL容器,定义时要在>>中间加上空格。

vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;	// node是结构体类型
vector<vector<int> > name;	// >>之间要加空格

容器内元素的访问

  • 通过下标访问:vi[index]

  • 通过迭代器访问:

    迭代器类似指针,定义为vector<typename>::iterator it;

    把迭代器指向开头:it = vi.begin()

    用迭代器访问值:*(it + i)

    vi[i]*(vi.begin() + i)是等价的。

    尾元素地址的下一个地址:vi.end()

    iterator还有自加操作:it++++it

    只有在vectorstring中才允许使用vi.begin()+i这种迭代器加整数的写法。

常用函数

  • push_back(x):在vector后面添加一个元素
  • pop_back():删除vector的尾元素
  • size():获得vector中元素的个数
  • clear():清空vector中的所有元素
  • insert(it, x):向vector的任意迭代器it处插入一个元素x
  • erase(it):删除it处的元素
  • erase(first, last):删除[first, last)内的所有元素

set

  • 集合
  • 内部自动递增排序且不含重复元素

使用

  • 头文件:#include <set>
  • 命名空间:using namespace std;

定义

set<typename> name;

vector写法类似

set<int> name;
set<double> name;
set<char> name;
set<node> name;
set<set<int> > name;

容器内元素的访问

只能通过迭代器访问:set<typename>::iterator it;

可以通过*it访问set里的元素。不能使用*(it + i)

for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
    ...
}

常用函数

  • insert(x):将元素插入set容器中
  • find(value):返回set中对应值为value的迭代器
  • erase(it):要删除的元素的迭代器
  • erase(value):要删除元素的值
  • erase(first, last)first为要删除区间的起始迭代器,last为要删除区间的末尾迭代器的下一个地址
  • size():获得set内元素的个数
  • clear():清空set中的所有元素

延伸

  • 元素不唯一用multiset
  • 不排序用unordered_set

string

使用

  • 头文件:#include <string>
  • 命名空间:using namespace std;

定义

string str = "abcd";

内容访问

  • 通过下标访问(和字符数组类似)
  • 如果要读入和输出整个字符串,只能用cincout;或者用str.c_str()string类型转换为字符数组
  • 通过迭代器访问:和vector一样

常用函数

  • +=string的加法,可以直接把两个string拼接起来
  • ==!=<<=>>=:两个string可以直接比较大小,规则是字典序
  • length()size():返回字符串的长度
  • insert(pos, string):在pos位置处插入字符串string
  • insert(it, it2, it3)it为原字符串欲插入的位置,it2it3为待插字符串首尾迭代器(左闭右开区间)
  • erase(it):删除单个元素,it为要删除元素的迭代器
  • erase(first, last):删除区间内元素,firstlast为首尾迭代器(左闭右开区间)
  • erase(pos, length)pos为要删除的起始位置,length为要删除的字符个数
  • clear():清空string中的数据
  • substr(pos, len):返回从pos开始、长度为len的子串
  • string::npos:常数-1
  • find(str2):返回str2str中的位置,如果没找到返回-1
  • find(str2, pos):从pos开始找str2
  • replace(pos, len, str2):把strpos位置开始、长度为len的子串替换为str2
  • replace(it1, it2, str2):把迭代器[it1, it2)范围的子串替换为str2

map

  • 将任何基本类型(包括STL)映射到任何基本类型(包括STL)
  • 会以键的顺序从小到大自动排序

使用

  • 头文件:#include <map>
  • 命名空间:using namespace std;

定义

map<typename1, typename2> mp;

typename1是键的类型,typename2是键值的类型。键是唯一的。

字符串必须使用string,不能使用字符串数组。

内容访问

  • 通过下标访问,map[key]

  • 通过迭代器访问

    it->first访问键,it->second访问值

常用函数

  • find(key):返回键为key的映射的迭代器
  • erase(it):删除迭代器处的元素
  • erase(key):删除键处的元素
  • erase(first, last):删除[first, last)的元素,firstlast是迭代器
  • size():获取映射的对数
  • clear():清空map中的所有元素

延伸

  • 一个键对应多个值用multimap
  • 不排序用unordered_map(C++11)

queue

  • 先进先出的队列

使用

  • 头文件:#include <queue>
  • 命名空间:using namespace std;

定义

queue<typename> name;

内容访问

front()访问队首元素,用back()访问队尾元素。

常用函数

  • push(x):将元素x入队
  • front():队首元素
  • back():队尾元素
  • pop():令队首元素出队
  • empty():检测队列是否为空
  • size():返回元素个数

注意:使用front()pop()之前,必须用empty()判断队列是否为空。

priority_queue

  • 优先队列
  • 底层用堆(heap)实现
  • 队首元素是当前队列中优先级最高的

用法

  • 头文件:#include <queue>
  • 命名空间:using namespace std;

定义

priority_queue<typename> name;

元素访问

  • top():访问队首(堆顶)元素

常用函数

  • push(x):将元素x入队
  • top():获得队首(堆顶)元素
  • pop():令队首(堆顶)元素出队
  • empty():检测队列是否为空
  • size():返回队列内的元素个数

优先级设置

  • 基本数据类型

    数字大的优先级越高,队首元素就是优先队列内元素最大的。

    priority_queue<int> q;
    priority_queue<int, vector<int>, less<int> > q;
    

    对基本数据类型来说,这两种定义是等价的。vector<int>写的是承载底层数据结构堆的容器,less<int>是对第一个参数的比较类,表示数字大的优先级大,greater<int>表示数字小的优先级大。

  • 结构体类型

    重载运算符“<”(不能重载“>”,会编译错误)

    struct fruit {
        string name;
        int price;
        friend bool operator < (fruit f1, fruit f2) {
            return f1.price < f2.price;
        }
    }
    

注意:使用top()前必须用empty()判断优先队列是否为空。

stack

使用

  • 头文件:#include <stack>
  • 命名空间:using namespace std;

定义

stack<typename> name;

容器内元素访问

只能用top()访问栈顶元素。

常用函数

  • push(x):将元素x入栈
  • top():获得栈顶元素
  • pop():弹出栈顶元素
  • empty():检测栈是否为空
  • size():返回栈内元素个数

pair

用处不大,略

algorithm头文件常用函数

  • 因为是C++的东西所以要加using namespace std;才能用

max()

max(x, y)返回x和y中的最大值,如果要返回三个数的最大值可以用max(x, max(y, z))的写法。

min()

min(x, y)返回x和y中的最小值。

abs()

abs(x)返回整数x的绝对值。如果要浮点数的绝对值,需要用math头文件下的fabs()

swap()

swap(x, y)交换x和y的值。

reverse()

reverse(it, it2)将数组指针或迭代器[it, it2)内的元素进行反转。

next_permutation()

next_premutation(it, it2)给出一个序列在全排列中的下一个序列。如果有下一个序列返回true,否则返回false。在原数组上操作,范围为[it, it2)。

fill()

fill(it, it2)将数组或某容器的某一段区间内赋某个相同的值。可以是数组类型中对应范围内的任意值。

sort()

在第4章中已经说过。

lower_bound()upper_bound()

  • 用在有序数组或容器中
  • lower_bound(first, last, val):在[first, last)中寻找第一个值大于等于val的元素的位置,如果是数组返回指针,如果是容器返回迭代器
  • upper_bound(first, last, val):在[first, last)中寻找第一个值大于val的元素的位置,如果是数组返回指针,如果是容器返回迭代器
  • 如果找不到元素,则返回可以插入该元素的位置的指针或迭代器

总结

元素访问

容器 下标 迭代器 其他
vector *(it + i)
set *it
string *(it + i) str.c_str()
map √(键) it->firstit->second
queue front() back()
priority_queue top()
stack top()

常用函数

容器 添加 删除 清除 查找 大小 空检测 其他
vector push_back(x)
insert(it, x)
pop_back()
erase(it)
erase(first, last)
clear() size()
set insert(x) erase(it)
erase(value)
erase(first, last)
clear() find(value) size()
string insert(pos, str)
insert(dst, src1, src2)
erase(it)
erase(first, last)
erase(pos, length)
clear() find(str2)
find(str2, pos)
substr(pos, len)
length()
size()
replace(pos, len, str2)
replace(it1, it2, str2)
map erase(it)
erase(key)
erase(first, last)
clear() find(key) size()
queue push(x) pop() size() empty()
priority_queue push(x) pop() size() empty()
stack push(x) pop() size() empty()

标签:vector,set,迭代,STL,元素,C++,erase,笔记,first
From: https://www.cnblogs.com/secant1006/p/17245023.html

相关文章

  • C++直接初始化和复制初始化
    引言在C++98中有两种变量初始化方式:直接初始化和复制初始化(拷贝初始化)。这两种初始化方式有着明显的差异,却由于编译器的优化而变得模糊。直接初始化语法形式:objType......
  • Spring笔记
    spring1.创建项目GroupID是项目组织唯一的标识符,比如我的项目叫test001 那么GroupID应该是com.lixiaoming.test001域名.公司名.项目名ArtifactID就是项目的唯一的......
  • Java学习笔记(八)GUI
    GUI编程如何学习?这是什么?它怎么玩?该如何去平时运用?组件窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘破解工具1.简介Gui的核心技术:SwingAWT,......
  • nest.js学习笔记(七) --知识点拾遗
    1、nestjs中引用esm插件nestjs是使用commonjs规范进行开发,但是目前市场上很多插件是使用module的形式进行开发,所以遇到引用问题时,建议开发都绕过去,使用功能差不多的插件,但......
  • 【笔记】好用的GIT
    一般使用流程你可以提出更改(把它们添加到暂存区),使用如下命令:gitadd<filename>gitadd*这是git基本工作流程的第一步;使用如下命令以实际提交改动:gitcommit-m"......
  • 【笔记】PCA——主成分分析:推导与问题
    PCA:主成分分析主要思想假设有m个n维数据,我希望只保留k维,尽可能减少信息损失,也就是(m,n)到(m,k)的过程比如一个实际应用场景,我有一堆wlatentcode,也就是(n,512)的数据......
  • webrtc QOS笔记三 RTT计算,SRS增加XR
    webrtcQOS笔记三RTT计算,SRS增加XRRTT计算方式WebRTC中目前有两种方式计算RTT:基于媒体流发送端的计算(默认开启)。通过SenderReport(SR)与ReceiverReport(RR)携带的信息......
  • Cadence入门笔记(六):布局和板框
    说明布局和走线是最复杂的一个环节,涉及诸多技巧和设计理念。但为了入门学习简单考虑,这里只做基本的操作步骤说明。隐藏飞线上一节放置好元件后就要开始布局了,布局前可以......
  • 面试笔记——计算机网络
    原文链接:javaguide常见面试题OSI和TCP/IP网络分层模型OSI七层模型OSI七层模型是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示:......
  • Cadence入门笔记(五):网表生成和导入
    检查封装在生成网表前要先确认器件封装和实际封装文件是否对应存在如下是之前设计好的封装文件.psm文件打开orcad,和元件属性中的封装内容对比确认一致如果实际封装和......