当前位置: 首页 > news >正文

C++ STL容器汇总

注:为期末考试作复习准备

std::vector<class T>

构造函数:

vector(size_t n, T t = T())

构造容量为n的vector,元素全部填充为t

std::vector<int> arr(3);

vector(initializer_list)

使用初始化列表赋初值

  std::vector<int> v{1, 2, 3, 4};for(auto x : v){std::cout << x << std::endl;}

vector(iterator first, iterator last)

使用[first,last)的元素初始化

  std::list<int> li{1,2,3,4};std::vector<int> v(li.begin(),li.end());for(auto x : v){std::cout << x << std::endl;}

vector(vector other)

拷贝构造

size_t size()

返回vector储存的元素个数

size_t capacity()

返回vector预存的总容量

bool empty()

返回vector是否为空

void push_back(T t)

在vector尾部插入元素t,若capacity() == size(),则先进行capacity的扩容,再尾插

void pop_back()

删除vector尾部元素,当vector为空时,调用该函数会出错

for (int i = 0; i <= 3; i++) {arr.pop_back();
}//会出错

void clear()

清空vector所有元素,但不改变capacity

void resize(size_t length, const T t = T() )

将vector的size修改至length,若length比原来的size()大,多出的元素补t,若比原来的小,则只保留前length个,不改变vector的capacity

void shrink_to_fit();

将capacity收缩至size

arr.shrink_to_fit();

void reserve(size_t t)

将capacity设置为t, 若t<size,则将capacity设置为size

iterator begin()

返回指向vector第一个元素的迭代器,迭代器可以简单理解为指向vector数组对应元素的指针,迭代器支持加减法运算

auto it = arr.begin();
auto it2 = it + 2;
auto it3 = it2 - 1;

iterator end()

返回指向vector最后一个元素的下一个位置的迭代器

iterator rbegin()

返回指向vector最后一个元素的迭代器

iterator rend()

返回指向vector第一个元素前一个位置的迭代器

使用反向迭代器遍历的方法,注意这里是++

  std::vector<int> v(4,5);for(auto it = v.rbegin(); it != v.rend(); it++){std::cout << *it << std::endl;}return 0;

void insert(const iterator it, T t)

在it处插入t, it及其以后的元素全都往后移一位,若在插入后发生扩容,it及其之后的迭代器全部失效,访问以上迭代器属于UB

  std::vector<int> v(3, 3);auto it = v.begin();it++;auto it2 = v.begin();it2++;it2++;v.insert(it, 10);std::cout << *it << ' ' << *it2 << std::endl; //undefined behaviour

void insert(const iterator it, size_t count, T t)

在it处插入count个t

void insert(const iterator it, iterator first, iterator last)

在it处,按顺序插入别的迭代器[first,last)区间的元素,first和last可以是任意容器的迭代器

  std::set<int> s {1,2,3,4};std::vector<int> v{5,6,7,8};v.insert(v.begin() + 2, s.begin(), s.end());for(auto x : v){std::cout << x << std::endl;}

void erase(iterator it)

删除it处的元素

void erase(iterator first, iterator last)

删除[first, last)区间的所有元素

不修改capacity

T& operator[](size_t index)

vector支持下标随机访问

T& at(size_t index)

随机下标访问,但会作边界检查,越界会报错

T& front()

返回第一个元素的引用

T& back()

返回最后一个元素的引用

void emplace_back(...)

传入T的构造函数所需的参数,则直接在vector尾部用这些参数构造该元素

class node{
private:int x, y;
public:node(int a,int b):x{a},y{b}{}friend std::ostream& operator<<(std::ostream& out, const node& u){out << u.x << ' ' << u.y << std::endl;return out;}
};int main(){std::vector<node> v;for (int i = 0; i < 3;i++){v.emplace_back(i, i + 1);}for(auto x:v){std::cout << x;}return 0;
}

void swap(vector& other)

与other交换内容

std::array<class T, size_t N>

构造声明:

其中n必须为编译时常量

std::array<int, n> arr;
std::array<int, n> arr2 = {1, 2, 3};

通用部分

size(), begin(), end(), rbegin(), rend(), swap, empty(), front(), back(), operator[], at()用法与vector一致

size_t max_size()

返回array的容量(数组定义长度)

T* data()

返回执行数组第一个元素的指针

void fill(T t)

用t来填充array

std::list<class T>

构造函数

与vector用法相同

通用部分

size(), empty(), push_back(), pop_back(), clear(), resize(), erase(), insert(), swap(), front(), back() 的用法同vector

push_front(), pop_front()为头插和头删,用法与push_back(), pop_back()类似

void remove(T t)

删除链表中所有值为t的结点

void unique()

去除连续重复数据,只保留一个

std::list<int> li{1,2,2,3,5,3,5};
li.unique();

去重后结果:

1,2,3,5,3,5

void sort(comparator)

给链表排序,默认升序,可传入自定义排序函数或仿函数

  std::list<int> li{1,2,2,3,5,3,5};li.sort([](int a, int b){ return a > b; });for(auto x :li){std::cout << x << std::endl;}

void reverse()

调用后,使链表本身翻转

std::list<int> li{1,2,2,3,5,3,5};
li.reverse();

void merge(list& other)

自身为升序链表,将另外一个升序链表有序合并到自身

void splice(iterator it, list& other)

将other按顺序插入it位置, it为自己的迭代器

void splice(iterator it, list& other, iterator other_it)

将other_it的元素插入it位置, it为自己的迭代器,不知道为什么这里非得传入这个other

void splice(iterator it, list& other, iterator other_first, iterator other_last)

将[first,last)的元素按顺序插入it位置

std::queue<class T, class container = std::deque<T> >

单向队列,可以指定实现容器container

构造函数

无参构造、拷贝构造

void push(T t)

向队尾插入元素t

void pop()

删除队首元素

T& front()、 T& back()

返回队首、队尾元素的引用

通用部分

empty(), size(), swap() 

无迭代器

deque<class T>

双端队列,支持随机访问,头/尾插入/删除效率比vector高

接口与vector几乎一致

只多了push_front(), pop_front()

std::priority_queue<class T, class container = std::vector<T>, class comparator = std::greater<T> >

默认小根堆,comparator传入std::less<T>成为大根堆

构造函数

无参构造、拷贝构造

通用部分

push(), size(), empty(), swap()

void pop()

将堆顶元素删除,并自动调整堆

void top()

获取堆顶元素

std::stack<class T>

构造函数

无参构造、拷贝构造

通用部分

push(), pop(), size(), empty(), swap()

void top()

返回栈顶元素

std::set<class T, class comparator = std::less<T> >

基于红黑树实现集合,不允许重复元素,comparator决定排序顺序

构造函数

同vector

通用部分

begin(), end(), rbegin(), rend(), size(), empty(), clear(), merge()

void erase(...)

迭代器版本与vector一致

这里还可以只传入T t,表示删除值t

void insert(T t)

插入元素t

size_t count(T t)

返回元素t的个数,有即1,无即0

iterator find(T t)

返回元素t的迭代器,元素t不存在则返回end()

iterator lower_bound(T t)

以t作为下界查找set中最小的元素,返回其迭代器, 不存在则返回end()

iterator upper_bound(T t)

返回t的后继的迭代器,不存在则返回end()

std::multiset<class T, ...>

用法与set基本一致,但这里允许插入重复的元素

std::pair<iterator, iterator> equal_range(T t)

返回一对迭代器,first表示t元素组成的数组(简单理解)的begin(), second表示end(),可以用这对迭代器遍历所有的t(虽然其实都是相等的)

void erase(...)

若传入的是T t,则会把全部t都删除

若传入的是迭代器,则只会删除迭代器指向的那个元素

std::map<class Key, class Value>

set<T>的本质可以说就是map<T, T>

因此map的用法和set基本相同

迭代器

map的迭代器解引用返回的是std::pair<Key, Value>

Value operator[](Key key)

支持以key作为下标访问

若key存在,返回对应的value

若key不存在,向map中插入键值对(key, Value()),并返回Value()

Value at(Key key)

作用同operator[], 但key不存在时会抛异常

std::multimap<Key, Value>

相同的键可映射多个Value

接口同multiset

std::string

构造函数

string(char* s)

使用s初始化

string(char* s, size_t  pos, size_t npos)

使用s的pos到pos+npos-1来初始化

string(char* s, size_t npos)

使用s的0到npos-1来初始化

其余构造函数同vector

通用部分

size(), empty(), capacity(), max_size(), resize(), shrink_to_fit(), reserve(), front(), back(), begin(), end(), rbegin(), rend(), opeartor[], at(), reverse()

注:size和length都不计入'\0'

string& append(const string& str)

string& append(const string& str, size_t subpos, size_t sublen)

string& append(const char* s)

string& append(const char* s, size_t n)

string& append(size_t n, char c)

string& append(iterator first, iterator last)

string& operator+=(const string& str)

string& operator+=(const char* s)

string& operator+=(char c)

在字符串后追加传入的参数

const char* c_str()

const char* data()

获取c风格字符串

string& erase(...)

迭代器版本与其他容器一致

string& erase(size_t pos = 0, size_t npos = length)

将下标为pos到pos+npos-1的字符都删除

若pos+npos-1越界,则删到字符串尾部结束

string& insert(size_t pos, const string& str)

string& insert(size_t pos, const string& str, size_t subpos, size_t sublen)

string& insert(size_t pos, const char* s)

string& insert(size_t pos, const char* s, size_t n)

string& insert(size_t pos, size_t n, char c)

void insert(iterator it, size_t n, char c)

iterator insert(iterator it, char c)

void insert(iterator it, iterator first, iterator last)

可以看到,insert就是比append多了第一个pos参数,其他基本一致,表示在pos处append

void assign(...)

std::string operator=(...)

赋值用法

assign和append传参格式相同

+=和=传参格式相同

string substr(size_t pos, size_t len = npos)

返回从pos开始,长度为len的子串

int compare(const string& str)

int compare(size_t pos, size_t len, const string& str)

int compare(size_t pos, size_t len, const string& str, size_t subpos, size_t sublen)

int compare(const char* s)

int compare(size_t pos, size_t len, const char* s)

int compare(size_t pos, size_t len, const char* s, size_t n)

使用自身的pos到pos+len-1的子串与目标的subpos到subpos+sublen-1的子串比较字典序

小于返回-1,等于返回0,大于返回1

size_t find(const string& str, size_t pos = 0)

size_t find(const char* s, size_t pos = 0)

size_t find(const char* s, size_t pos, size_t n)

size_t find(char c, size_t pos = 0)

从pos开始,从左往右找目标串,返回第一个找到的子串首下标,

找不到时,返回SIZE_MAX

第三个重载的n表示s的截取长度

size_t rfind(...)

参数格式与find一致

不过这里是从右往左找

也是返回第一个子串首下标

相关文章:

  • 《TCP/IP协议卷1》第3章 IP协议
  • 成像细节丢失如何解决?OAS 矩孔衍射聚焦模型来解困
  • Python开发功能项目
  • 一步一步学python之(5)基本语法
  • Xsens动捕和Manus数据手套在元宇宙数字人制作中提供解决方案
  • 黑马教程强化day2-3
  • PPIO 上线 Qwen3-Embedding 系列模型
  • 学习STC51单片机35(芯片为STC89C52RCRC)智能小车3(PWM调速小车)
  • 算法: 和为 K 的子数组
  • 海外打车代驾app订单系统框架搭建
  • 芯片电感需求趋势及选型关键因素
  • 英语作文模板
  • 若以floeable流运行(前后端分离)
  • 深度学习:张量标量概念、PyTorch张量创建、类型转换等
  • 医院部署IBMS系统时,哪些关键因素需要重点权衡与规划
  • Webpack 剖析与策略
  • <论文>自注意力序列推荐模型SASRec
  • AES加密
  • C语言二级指针和void *应用
  • 说一下Java里面线程池的拒绝策略
  • 重庆 企业网站建设/西安网是科技发展有限公司
  • 商会网站怎么做/无锡网站优化
  • 湖南省建设厅网站/网络广告文案
  • 八大美院视觉传达设计作品/seo服务外包报价
  • 做一个网站后期维护需要多少钱/爱站网seo工具
  • 动漫制作与设计专业/seo排名点击器