C++的STL标准库

STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称,主要出现在C++中;STL提供了六大组件,彼此之间可以组合套用,

这六大组件分别是容器、算法、迭代器、仿函数、适配器和空间配置器。

一、STL标准库的容器 

1. vector动态数组 

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素

头文件

#include<vector>

vector的声明和初始化 

复制代码
#include<vector>
// 初始化一维可变长数组
vector<int> nums;    // 声明一个动态数组nums
vector<int> nums(10);     // 声明一个初始长度为10的动态数组nums
vector<int> nums(10,2);     // 声明一个初始长度为10,内容都为2的动态数组nums
vector<int> nums = {1,2,3,4,5,6};     // 也可用{}初始化数组
vector<int> a(nums); // 用nums中的内容初始化a vector<int> a(nums.begin(),nums.begin() + 2) // 用nums前两个初始化a
int a[] = [1,2,3,4,5,6]; // 还可以使用数组a来初始化nums vector<int> nums(a,a+2); vector<int> nums(&a[0],&a[2]); // 初始化二维可变长数组 vector<vector<int>> nums; vector<vector<int>> num(10,vector<int>(5,0)); // 定义了一个10行5列全为0的数组
复制代码

 vecotr的访问

复制代码
// 单个访问
cout << nums[1];

// 遍历
for (int i = 0; i < nums.size(); i++){
    cout << nums[i];  
}

// 自动类型
for (auto i : nums)
    cout << i;
复制代码

vector的方法函数   

 

 注意事项:

1. 对vector进行排序时,应是sort(nums.begin(),nums.end())

2. nums[i] 与 *(nums.begin() + i) 等价

 

2、stack栈 

栈为数据结构的一种,是STL中遵循先入后出的容器

头文件

#include<stack>

stack的定义

// stack的定义
stack<int> s1;
stack<int> s2(s1);  // 用s2初始化s1
stack
<string> s1; stack<node> s1;

stack的方法函数

 

 

可以考虑使用vector模拟栈

 

3、queue队列

队列是一种先入先出的数据结构

头文件

#include<queue>

queue的定义

queue<int> a;

queue的方法函数

 

4、deque双端队列

首尾都可以插入和删除的队列称为双端队列

头文件

#include<deque>

deque的定义

queue<int> q1;

deque的方法函数

 

 deque可以进行排序,但只能从小到大排序

 

5、map映射

映射和python中的字典类似,一个键对应一个键值

头文件

#include<map>

map的定义

map<string, string> dic;
map<string, int> dic;

map会按照键的大小从小到大自动排序

map的方法函数

map和set的end()函数都是指向末尾的下一个

map的begin()和end()遍历

复制代码
#include<iostream>
#include<map>

map<int,int> dic;
map[0] = 1;
map[1] = 2;
map[2] = 3;
auto bg = map.begin();  //此处返回的是第一个元素的迭代器  bg是结构体指针
while (bg != map.end()){
        cout << bg->first << " " << bg->second << endl;  // ->first  ->second 是map迭代器的用法,分别返回的是键和键值  
        bg ++;  
}
复制代码

还可以使用rbegin 和 rend逆序遍历map

复制代码
#include<iostream>
#include<map>

map<int,int> dic;
map[0] = 1;
map[1] = 2;
map[2] = 3;
auto bg = map.rbegin();
while (bg != map.rend()){
        cout << bg->first << " " << bg->second << endl;  
        bg ++;  
}
复制代码

map添加元素

复制代码
#include<map>

map<int,int> dic;

// 直接添加
dic[1] = 1;

// 插入键值对
dic.insert({1,1});
dic.insert(make_pair(1,1));
dic.insert(pair<int,int>(1,1));
复制代码

map访问元素

复制代码
// 下标直接访问
cout << dic[1] ;

// 遍历访问
// 结构体指针
auto it = dic.begin();
for(it;it != dic.end(); it++){
      cout << it -> first << " " << it->second << endl;
}

// 智能指针
for (auto it : dic){
     cout << it.first << " " << it.second << endl;
}

// 对单个元素进行访问 还是结构体指针
auto it = dic.find(3);
cout << it->first;

// c++17之后的特性
for (auto [x,y] : dic){
cout << x << " " << y << endl;
}
复制代码

 

6. set集合

set和python中的集合类似,集合中的元素不重复且有序,自动按照从小到大排序

头文件

#include<set>

集合的定义

set<int> hash;

集合的方法函数

map和set的end()函数都是指向末尾的下一个

 

其他的set:multiset(元素可以多次且有序)、unordered_set(元素仅一次但无序)、unorder_multiset(元素多次且有序)

 

7. pair

pair只含有两个元素,+可以看作只有两个元素的结构体,其作用为作为二元结构体或作为键值对插入。

#include<utility>
pair<string,int> p;
pair<string,int> p("yaya",250);

p = {"ya",250};

 

8. string字符串

可以把string理解为一个字符串类型,可以像int之类的直接定义。

#include<string>

string str1;
string str2("abc");
string str3("abcde",0,3);    // 从0位置开始(0不写默认为0),长度为3  abc
string str4(5,'a');      // 5个a
string str5(str2,0,2);     // 你猜是啥   2是长度!

string可以访问单个字符 str[i],也可以用cout直接全部输出

string字符串可以直接用 <  >  =  <=  >=  != 等比较

string字符串可以使用 + 进行拼接

键盘读入字符串相关:

#include<string>
string s1,s2;
cin >> s1;     // 读入字符串,遇到空格(只保留空格前)或回车结束
getchar();
getline(cin,s2);     // 读入字符串,能保留空格,遇回车结束

上述代码中有一个getchar,是因为getline会获取前一个输入的换行符,影响字符串的读取,所以需要getchar把换行符读走,或者在使用cin后加一行cin.ignore()

string的方法函数

 

 

 

 

 

 

 

 

 

 

 

 

 

 可用sort按照ascii排序

9. list 链表 

就是链表

#include<list>

list<int> l1;
list<int> l1{1,2,3,4,5,6};
list<int> l1(5,3);

方法函数:begin()、end()、push_back、push_front、empty()

resize() :resize(n)设定链表仅能容纳n个元素,超出的将被删除,如果n比原来list的长度长,则默认超出的为0,也可resize(n,m)

front()、back()、swap()交换两个链表、pop_back()、pop_front()、reverse()

merge(a,b):执行后b为空

insert()、erase()删除全部指定的元素、remove()移除单个元素

posted @   Liang-ml  阅读(1197)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示