【STL中容器汇总】map、list、vector等详解

容器学习分享

1、STL简介

STL,标准模板库,是C++标准库的一部分,重在提高了代码的复用性;主要包含了常用的数据结构和基本算法,为广大c++程序员提供了一个可扩展的应用框架。

  • STL(Standard Template Library,标准模版库)
  • STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接。
  • STL几乎所有的代码都采用了模版类或模版函数

1.1、STL六大组件

STL大体分为六大组件,分别是:容器,算法,迭代器,适配器,函数对象,分配器。

  • 容器:各种数据结构,如vector,list,map,deque,set等,用来存放数据。
  • 算法:提供了一组常见的算法,如排序、查找、拷贝、变换等。
  • 迭代器:用于遍历和访问容器中的元素。
  • 函数对象:是一种可调用对象,可以像函数一样使用。
  • 适配器:是一种设计模式,用于将某个类转换为另一个类的接口。
  • 分配器:是用于管理内存分配的组件。它们通常用于动态分配内存,并将分配的内存返回给调用者。

2、vector容器

2.1、vector 基本操作

(1)头文件

#include.

(2)创建vector对象,

vector vec;

(3)尾部插入数字:

vec.push_back(a);

(4)使用下标访问元素

cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector::iterator it;

for(it=vec.begin();it!=vec.end();it++)

cout<<*it<<endl;

(6)插入元素:

vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:

vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:

vec.size();

vec.resize;改变大小

(9)清空:

vec.clear();

2.2、vector容器示例

cpp 复制代码
#include <iostream>
#include <algorithm> //标准算法头文件
#include <vector>	//包含向量容器头文件
using namespace std ;

void myPrint(int val)
{
	cout<< val <<endl;
}
void test01()
{
	//创建迭代器
	vector<int> v;
	//向容器中添加数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	//通过迭代器遍历读取容器中的数据
	vector<int>::iterator it;
	for(it=v.begin();it!=v.end();it++)
	{
		cout<<*it<<endl;
	}
	//另一种遍历方式
	for_each(v.begin(),v.end(),myPrint);
}
int  main()
{    
	test01();
	return 0;
}

2.3、vector容器存放自定义数据类型示例

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

class Person
{
public:
	Person(string name,int age)
	{
		this->name =name;
		this->age=age;
	}
	string name;
	int age;
};
void test01()
{
	vector<Person> v;
	Person p1("aaa",10);
	Person p2("bbb",20);
	Person p3("ccc",30);
	//向容器中添加数据
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	//遍历容器
	vector<Person>::iterator it;
	for(it=v.begin();it!=v.end();v++)
	{
		cout<<(*it).nema<<endl;
		cout<<(*it).age<<endl;
	}
}
void test02()
{
	vector<Person*> v;
	Person p1("aaa",10);
	Person p2("bbb",20);
	Person p3("ccc",30);
	//向容器中添加数据
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	//遍历容器
	vector<Person*>::iterator it;
	for(it=v.begin();it!=v.end();v++)
	{
		cout<<(*it)->nema<<endl;
		cout<<(*it)->age<<endl;
	}
}
int main()
{
	test01();
	test02();
	return 0;
}

2.3、vector嵌套vector示例

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

void test01()
{
	vector<vector<int>> v;
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;

	for(int i=0;i<4;i++)
	{
		v1.push_back(i+1);
		v2.push_back(i+2);
		v3.push_back(i+3);
	}
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	vector<vector<int>>::iterator vs;
    for(vs=v.begin();vs!=v.end();vs++)
    {
    	//(*vs)  --容器 vector<int>
    	vector<int>::iterator vit;
    	for(vit=(*vs).begin();vit!=(*vs).end();vit++)
    	{
    		cout<<*vit<<endl;
    	}
    }
	
}
int main()
{
	test01();
	return 0;
}

3、list 容器

功能:将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链表实现的。

链表的组成:链表是由一系列结点组成

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域;

STL中的链表是一个双向循环链表

3.1使用示例

cpp 复制代码
#include <iostream>
#include <list>
using namespace std ;
int main(){
	list<int> Link;	//构造一个列表用于存放整数链表
	int i, key, item;    
	for(i=0;i < 10;i++)// 输入10个整数依次向表头插入{
		cin>>item;
		Link.push_front(item);
	}
	cout<<"List: "; // 输出链表
	list<int>::iterator p=Link.begin();
		while(p!=Link.end()){ //输出各节点数据,直到链表尾
		cout <<*p << "  ";
		p++;  //使P指向下一个节点
	}
	cout << endl;
	cout << "请输入一个需要删除的整数: ";
	cin >> key;
	Link.remove(key);   
	cout << "List: "; // 输出链表
	p=Link.begin();	// 使P重新指向表头
	while(p!=Link.end()){ 
		cout <<*p << "  ";
		p++; // 使P指向下一个节点
	}
	cout << endl;
}

3.2、list容器基本函数

4、map容器

map容器中所有元素都是pair

pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)

所有元素都会根据元素的键值自动排序

4.1、map函数原型

4.2、map函数示例

cpp 复制代码
#include <iostream>
#include <map>
using namespace std;

void test()
{	
	map<int ,int> m;	//创建map容器
	map<int ,int>::iterator it;//创建map容器迭代器
	//容器插入方式
	//一
	m.insert(pair<int,int>(1,10));
	//二
	m.insert(make_pair(2,20));
	//三
	m.insert(map<int,int>::value.type(3,30));
	//四
	m[4]=40;
	//容器的删除
	m.erase(m.begin());   //删除容器中首位元素
	m.erase(3);			  //删除容器中key为3的元素
	//查找
	map<int,int>::iterator pos =m.find(3);
	if(pos!=m.end())
	{
		cout<<"key"<<it->first<<"value"<<it->second<<endl;
	}
	
}
int main()
{
	test();
	return 0;
}
相关推荐
秋の花几秒前
【JAVA基础】Java集合基础
java·开发语言·windows
jrrz08281 分钟前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
小松学前端3 分钟前
第六章 7.0 LinkList
java·开发语言·网络
可峰科技12 分钟前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
咖啡里的茶i16 分钟前
Vehicle友元Date多态Sedan和Truck
c++
全栈开发圈16 分钟前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
面试鸭21 分钟前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展
小白学大数据22 分钟前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
海绵波波10723 分钟前
Webserver(4.9)本地套接字的通信
c++
Python大数据分析@25 分钟前
python操作CSV和excel,如何来做?
开发语言·python·excel