STL入门学习Day1

STL概述

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

STL是由容器、对象、算法、迭代器、函数对象、适配器、内存分配等六部分构成。

STL容器,即封装好的数据结构方法,如插入链表的操作等。STL 提供有 3 类标准容器,分别是序列容器、排序容器和哈希容器,其中后两类容器有时也统称为关联容器。

容器类别主要特性
序列容器包括array数组容器、vector向量容器、list列表容器以及deque双端队列容器。序列容器即无序容器
排序容器包括set集合容器、multiset多重集合容器、map映射容器以及multimap多重映射容器。排序容器中的元素默认从小到大排序。
哈希容器C++11中新加入的四种关联式容器。暴力unordered_set哈希集合、unordered_multiset哈希多重集合、unordered_map哈希映射以及unordered_multimap哈希多重映射。哈希容器中的元素位置由哈希函数决定

STL头文件共13个

<list>   <map>   <deque>   <set>    <iterator>   <vector>   <queue>   
<stack>   <algorithm>   <memory>   <functional>   <numeric>   <utility>      

vector容器的基本操作如下

一、vector初始化操作

#include <iostream>
#include <vector>
using namespace std;
int main(){
	vector<int>::iterator i;
//	vector<int> v{1,2,3,4,5};//c++98标准不支持 直接初始化,要用函数进行插值
	
	//vector初始化方法
	//1、定义空的vector
	vector<int> v_empty;
	//2、定义长为5且所有元素初始化为2 
	vector<int> v_const(5,2);
	//3、定义并指定初始长度,默认初始所有元素为0 
	vector<int> v(10);
	//4、利用出入函数对vector进行初始化赋值
	for(int i=0;i<10;i++){
		v_empty.push_back(i);
	}
	
	//vector在指定位置插入元素,insert(迭代器,数值) 
	v_empty.insert(v_empty.begin(),10);
	//在vector中值为8的位置前插入88 
	for(i=v_empty.begin();i<v_empty.end();i++){
		if(*i==5){
			v_empty.insert(i,88);
			break; 
		}
	}
	
	//使用erase()删除指定元素  erase(迭代器) 
	// v_empty.erase(v.begin()); 直接使用begin和end函数会报错
	//在指定位置删除元素 ,删除元素5 
	 for(i=v_empty.begin();i<v_empty.end();i++){
		if(*i==5){
			v_empty.erase(i); 
			break; 
		}
	} 
	//删除末尾元素
	 v_empty.pop_back();
	 
	 //清空操作
//	 v_empty.clear(); 

	//返回容器大小 
	cout<<v_empty.size()<<endl;
	 
	//利用迭代器i遍历vector并输出 
	for(i=v_empty.begin();i<v_empty.end();i++) {
		cout<<*i<<" ";
	}
	return 0;
}

二、其他常用函数
vector.size() 返回元素实际个数
vector.capacity() 返回容器当前容量
vector.assign() 用心元素替换原有内容
vector.reserve() 增加容器的容量
注:vector在使用reserve()使容器容量变化之后,首个元素的存储地址发生了改变,因此,每当 vector 容器的容量发生变化时,都要对之前创建的迭代器重新进行初始化

三、vector访问元素操作

#include <iostream>
#include <vector>
using namespace std;
int main(){
	vector<int>::iterator i;

	vector<int> v_empty;
	for(int i=0;i<10;i++){
		v_empty.push_back(i);
	}
	
	//利用迭代器i遍历vector并输出 
	//1、利用迭代器访问vector元素 
	for(i=v_empty.begin();i<v_empty.end();i++) {
		cout<<*i<<" ";
	}
	cout<<endl;
	//2、利用vector下标访问元素 
	cout<<v_empty[6]<<endl;
	//3、利用vector自带函数front()、back()访问/修改头尾元素
	cout<<"front()访问头元素:"<<v_empty.front()<<endl;
	cout<<"back()访问尾巴元素:"<<v_empty.back()<<endl;
	v_empty.front()=50;
	v_empty.back()=55;
	cout<<"vector的新头元素为:"<<v_empty.front()<<endl;
	cout<<"vector的新尾元素为:"<<v_empty.back()<<endl;
	//4、利用at()访问元素
	cout<<"利用at()访问元素:"<<v_empty.at(4)<<endl; 
	//若下标越界会提示报错信息 
//	cout<< v_empty.at(11)<<endl; 
	//5、利用data()返回指向容器中首个元素的指针
	cout<<"data()返回vector首地址:"<<v_empty.data()<<endl;
	cout<<"data()返回vector首地址数值:"<<*v_empty.data()<<endl;
	cout<<"data()返回vector任意位置数值:"<<*(v_empty.data()+3)<<endl;
	return 0;
}

四、删除元素操作

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main(){
	vector<int>::iterator i;

	vector<int> v_empty;
	for(int i=0;i<10;i++){
		v_empty.push_back(i);
	}
	
	//利用迭代器i遍历vector并输出 
	//1、利用迭代器访问vector元素 
	for(i=v_empty.begin();i<v_empty.end();i++) {
		cout<<*i<<" ";
	}
	cout<<endl;
	//删除元素操作 
	//1、pop_back()删除vector的最后一个元素,vector的size减1,capacity不变
	v_empty.pop_back();
	for(i=v_empty.begin();i<v_empty.end();i++) {
		cout<<*i<<" ";
	}  
	cout<<endl;
	//2、erase(pos)删除指定位置的元素,size减1,capacity不变
	for(i=v_empty.begin();i<v_empty.end();i++) {
		if(*i==2){
			v_empty.erase(i);
		}
	}
	for(i=v_empty.begin();i<v_empty.end();i++) {
		cout<<*i<<" ";
	}  
	cout<<endl; 
	//3、clear()删除所有元素,size变为0,capacity不变 
	v_empty.clear() 
	
	return 0;
}

基于pop_back()、clear()、erase()删除元素操作都不会改变vector的容量,因此在for循环进行元素遍历时应使用size属性(动态改变)。

五、emplace_back()和push_back()的区别
同:都是在vector尾部添加元素
异:底层实现机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。emplace_back() 的执行效率比 push_back() 高
参考博文:http://c.biancheng.net/view/6826.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值