- zouyc 的博客
STL与vector
- @ 2025-9-19 10:10:45
什么是STL
C++标准库是一组C++类,就像一个工具箱,提供了通用的功能函数。

STL全程是标准模板库,是C++标准库的核心部分,大约占80%。

常用STL
- vector 变长数组
- stack 堆栈
- queue,priority_queue,deque 队列
- map,unordered_map,unordered_multimap 哈希表
- set,multiset,unordered_multiset 集合
- bitset 压位
vector简介
vector 向量,理解为容量大小可变化的数组。 需要包含头文件。
迭代器简介
iterator:迭代器,变量名经常定义it,前两个字母it。 定义一个迭代器,相当于定义了一个指针,具体指向哪,要看代码的具体初始设置。

advance用法图解
advance是连续都走多个元素时用的函数。 下面是正向迭代器图解:

下面是反向迭代器图解:

vector输入输出代码
#include<iostream>
#include <vector>
using namespace std;
int main() {
// vector<int> a; //定义一个vector变量
// a.push_back(10);
// a.push_back(20);
// a.push_back(30);
// cout<<a.size()<<endl; //返回元素的个数
//a.resize(10); //动态调整大小到10
// a.resize(10,5); //自动新增元素,初始化为5
// cout<<a.size()<<endl; //返回元素的个数
//定义时指定容量,初始值
// vector<int> a(10,90); // 容量10,初值90
// cout<<"初始化变量:";
// // 第1种遍历元素法,照顾到数组的使用习惯
// for (int i=0;i<a.size();i++)
// cout<<a[i]<<' ';
// cout<<"\n赋值输入数据:"; //修改元素
// cin>>a[2];
// cin>>a[5];
// cin>>a[8];
// cout<<"赋值后遍历:";
// for (unsigned int i=0;i<a.size();i++)
// cout<<a.at(i)<<' '; // 等效于a[i]
// 定义vector数组
vector<int> a[10]; //a是数组,每个元素都是vector<int>
a[0].push_back(21);
a[0].push_back(22);
a[0].push_back(23);
for (int i=0;i<a[0].size();i++)
cout<<a[0][i]<<' ';
return 0;
}
遍历元素代码
//vector的三种遍历元素的方法
#include<iostream>
#include <vector>
using namespace std;
int main() {
//vector<int> a(10,90); // 容量10,初值1
vector<int> a;
for (int i=1;i<=10;i++) {
a.push_back(i*10); //10 ... 100
}
// a.clear(); //把元素清空
// cout<<a.size();
// for (int i=0;i<a.size();i++) //第1种遍历元素法
// cout<<a[i]<<' ';
// for (int i=0;i<a.size();i++) //第1种遍历元素法,结果同上
// cout<<a.at(i)<<' ';
// 赋值:修改值
// for (int i=0;i<a.size();i++)
// a[i]=i+6;
//
// a[0]=10;
// a[1]=20;
// for (int i=0;i<a.size();i++) //第1种遍历元素法
// cout<<a[i]<<' ';
// 正向迭代器 a.begin,会指向a[0] //第2种遍历方法
// for (vector<int>::iterator it=a.begin(); it!=a.end(); ++it) {
// cout<<*it<<' ';
// }
//第2种方法的简洁写法 vector<int>::iterator ,用auto替换
// for (auto it=a.begin(); it!=a.end(); ++it) { //第2种 auto自动匹配类型
// cout<<*it<<' ';
// }
//假设想从第2个开始访问
// vector<int>::iterator it;
// it=a.begin(); //位置在 值10
//
// it++; //指向第2个位置
// cout<<*it;
//指向第6个位置
// cout<<endl;
// vector<int>::iterator it;
// it=a.begin();
// advance(it,6); //往右方向,走6下,自己不算
// cout<<*it; //70
// 逆向迭代器 begin -> rbegin; end -> rend
//rbegin的r,rend()的r,就是reverse的第一个字母
// cout<<endl;
// for (vector<int>::reverse_iterator it=a.rbegin(); it!=a.rend(); ++it) {
// cout<<*it<<' ';
// }
// for (auto it=a.rbegin(); it!=a.rend(); ++it) { //简略写法
// cout<<*it<<' ';
// }
// cout<<endl;
vector<int>::reverse_iterator it=a.rbegin();
advance(it,4);
cout<<endl;
cout<<*it;
// cout<<endl; //第3种遍历元素法
// for (auto y:a) {
// cout<<y<<' ';
// }
// cout<<endl;
// cout<<a.front(); // 第一个元素
return 0;
}
vector综合练习代码
/*
p_vector_1.cpp v1.0.1
向量操作(vector<int> v)
v.empty() 判断是否为空,true为空
v.push_back(x) 尾部添加元素x
v.insert(it,x) 在迭代器it位置前增加元素x
v.insert(it,first,last) 在迭代器it位置前插入另一个相同类型向量的[first,last)间的数据
v.size() 元素的个数
v.max_size() 最大可允许的元素数量值
v.at(pos) 在pos位置的元素值
v.front() 首个元素值
v.back() 尾元素值
v.begin() 首元素的指针
v.end() 最后元素的下个指针
v.rbegin() 反向迭代器,指向最后一个元素
v.rend() 反向迭代器,指向首个元素的前一个位置
v.erase(it) 删除迭代器it指向的元素
v.erase(first,last) 删除迭代器[first,last)中元素
v.pop_back() 删除尾部元素
v.clear() 清空所有元素
sort 排序
*/
#include<iostream>
#include <vector>
#include <algorithm> //sort等
using namespace std;
bool cmp(int a,int b) {
return a>b; //>降序 ; <升序
}
int main() {
vector<int> a = {37,1,4,12,5,9,26,66,15,312};
//方法一
// cout << "遍历:";
// for (int i = 0; i<a.size(); i++)
// cout << a[i] << " ";
//方法二
// for (int i = 0; i<a.size(); i++)
// cout << a.at(i) << " ";
//方法三
// cout << "\n iterator bian li:";
// vector<int>::iterator it;
// for (it = a.begin(); it != a.end(); it++)
// cout << *it << " ";
//方法四,简洁,推荐使用
// for (auto xyz = a.begin(); xyz != a.end(); xyz++) //automatic,自动识别xyz为迭代器
// cout << *xyz << " ";
// 逆向迭代器 begin -> rbegin; end -> rend
// cout<<endl;
// for (vector<int>::reverse_iterator it=a.rbegin(); it!=a.rend(); ++it)
// cout<<*it<<' ';
// cout<<endl;
// for (auto it=a.rbegin(); it!=a.rend(); ++it)
// cout<<*it<<' ';
//add is also called insert
cout<<"\n before inserting:";
for (auto it=a.begin();it!=a.end();it++)
cout<<*it<<" ";
cout << "\n after insert data:";
a.insert(a.begin()+4,35);
for (unsigned int i = 0; i<a.size(); i++)
cout<<a[i]<<" ";
// cout<<"\nbefore deleting:";
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// cout << "\nafter deleted:";
// a.erase(a.begin()+2);
// for (int i=0; i<a.size();i++)
// cout<<a[i]<<" ";
// cout<<"\ndelete range data:";
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// cout << "\ndeleting 3 to 5:";
// a.erase(a.begin()+3, a.begin()+5);
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// Delete last element
// a.pop_back();
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// 修改元素4,位置在:a.begin + 2
// cout<<"\n修改前数据:";
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// cout << "\n修改后数据:";
// a[2]=100;
// for (int i=0; i<a.size();i++)
// cout<<a[i]<<" ";
// 查找 元素66
// int x=66;
// for (auto it = a.begin(); it != a.end(); it++) {
// if (x==*it) {
// cout<<to_string(x)+"找到啦!";
// break;
// }
// }
// sort(a.begin(),a.end()); //升序
// for (auto x:a) cout<<x<<' ';
// sort(a.begin(),a.end(),greater<int>()); //降序
// for (auto x:a) cout<<x<<' ';
// sort(a.begin(),a.end(),cmp); //降序,用cmp
// for (auto x:a) cout<<x<<' ';
// cout<<"\n排序前数据:";
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
// size_t startIndex = 2; // 指定范围排序:第3个开始,共5个
// size_t count = 5; // 要排序的元素数量
//
// if (startIndex + count > a.size()) { // 确保startIndex和count不会导致越界
// count = a.size() - startIndex; // 调整count以适应vector的实际大小
// }
// sort(a.begin()+startIndex, a.begin() + startIndex + count, cmp); //部分元素排序
// cout<<"\n排序后数据:";
// for (auto it=a.begin();it!=a.end();it++)
// cout<<*it<<" ";
return 0;
}