STL基础应用

1.vector

声明:

vector<int>vec1;
vector<int>vec2[10]{1,2,3,4,5};
vector<pair<int int> >vec3;//vec3[{i,j}];

注意:下标从0开始,<>中可用多种变量类型,上述以int为例

操作:
vector可以当成下标无限的数组,进行声明后可以进行可进行数组没有的很多操作,如:

vec.size();//vec的长度
vec.clear();//清除vec中所有元素
vec.empty();//判断vec是否为空,是空回复1
vec.push_back(5);//在vec后添加5
vec.insert(vec.begin()+2,27);//在vec的第3个位置添加27,其余往后移
vec.erase(vec.begin()+3);//把vec的第4个元素删除
...

vector进行输入时只能vec.push_back();,vector的长度相应增加,时间效率很高。
两个vector可直接赋值vec1=vec2;
进行输出时可以用cout<<vec;也可以用“:for循环”,如:

for(auto num:vec){
    cout<<num<<' ';
}

for(auto& num:vec){
    num+=1;
}

for(const auto& num:vec){
    num+=1;
}

for(auto& [a,b]:vec){
    a+=1;
}

1.用auto后不用考虑变量类型,
2.把vec每一个量输到num中,
3.加上‘&’后可把num同步到vec的每个数,
4.加入const后即避免拷贝,又防止意外修改,
5.第4个for只针对vector<pair<int int> >vec;这种类型,
6.auto也可替换成对应变量类型,
7.使用时要点击C++中的[工具],再点击[编译选项],在第一个框中加入以下代码并在框上打勾。

-std=c++11 -Wl,--stack=12345678

2.set和multiset

声明:

set<int>Set;
multiset<int>MSet;

注意:下标从0开始,<>中可用多种变量类型,上述以int为例

操作:
set与multiset中的每一个数据会自动排序,按照升序排列,即从小到大,与优先队列相似,其中若放置srting或char类型的数据会按字典序排列。
set与multiset的区别是,set当中的变量不会重复加入,而multiset则会加入重复变量。

迭代器
set迭代器只读取不修改元素;
.begin()与.end()为系统自带的迭代器,.begin()指向第一个位置,.end()指向最后一个元素的下一个位置(哨兵位置),所以永远不能引用.end();
我们也可以自己获取迭代器

set<int>s;
auto it_begin=s.begin();
auto it_end=s.end();
cout<<*it_begin;//*后加迭代器可输出值

也可以

set<int>s;
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it;

其他
set与multiset和vector一样都有很多快捷操作如:

Set.insert(1);//Set后插入1
Set.clear();
Set.empty();
Set.size();
Set.find(1);
//在Set中查找,结果为迭代器,找不到则为最后一个位置的后1位即Set.end();
Set.erase(2);
//若此数存在set中则删除,之中也可以加迭代器删除迭代器对应数
if(it=Set.find(40)!=Set.end())Set.erase(it);
//在multiset中,it为迭代器,有多个相同元素只删一个
Set.erase(it,Set.end());
//it为迭代器,删去从it到最后之间的所有数
Set.lower_bound(40);
//大于等于40的最小元素的迭代器;
Set.upper_bound(40);
//大于40的最小元素的迭代器;
Set.count(40);
//等于40的元素个数
multiset同理

set与multiset进行输入时只能Set/multiset.insert(1);,set与multiset的长度相应增加,时间效率很高,
若set与multiset的变量类型为vector,Set/MSet.insert();的()中也可以直接赋值一整个vector的变量,且只占1个长度。

与vector相同set与multiset也有“:for循环”形式,与vector基本相同,但set与multiset不允许修改其中的值,也就是无法使用for(auto& num:Set/multiset) num+=1;

3.map

声明:

map<int,int>Map;
ma'pmap<pair<int int>, int>Map2;//map2[{i,j}];

注意:map中的下标是无序的,<>中的两种可用多种变量类型,上述以int为例

操作:
map中的下标没有类型限制可用字符型或字符串型map的两个变量类型分别对应map的关键字()(key)与关键字的值,若关键字的变量类型为pair<>则有两个,用{}与map的[]分开,如Map[{ }]
map与set,vector一样都有快捷操作如:

Map.clear();
Map.empty();
Map.size();
...
//参考vector

map也有迭代器且与set类似,不在过多叙述

map的key值在定义时,只要求是有序的,而不是像数组或vector必须是连续的整型,所以很多数组无法实现的功能我们用map来做。
map也可以用“:for循环”,操作时for中变量的类型一定要与map的key的变量类型对应,若用auto则不用。

总结

vector作为可变长度的数组,不必考虑是否超空间与运行错误的问题,在图论邻接表的书写上,也可以用vector代替。

set作为集合类容器,因为其的有序性,所以可以高效地在set中进行二分查找,可以将其作为一个基础高级数据结构来使用。

map可以理解为set的加强版,提供一对一映射的数据存储和处理功能,其重载了下标运算符,功能进一步得到拓展,可以认为map的下标可以为任意有序类型,且不需要连续。

优先队列续

priority_queue<ll,vector<ll>,greater<ll> >pq;

(小顶堆)

priority_queue<pair<ll, ll>, vector<pair<ll, ll> >, greater<pair<ll, ll> > > pq;

(大顶堆)

posted @ 2026-10-19 17:20  Build-xhz31  阅读(5)  评论(0)    收藏  举报