什么是STL

C++标准库是一组C++类,就像一个工具箱,提供了通用的功能函数。

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

常用STL

  1. vector 变长数组
  2. stack 堆栈
  3. queue,priority_queue,deque 队列
  4. map,unordered_map,unordered_multimap 哈希表
  5. set,multiset,unordered_multiset 集合
  6. 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;
}