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

news2024/11/15 17:38:54

容器学习分享

  • 1、STL简介
    • 1.1、STL六大组件
  • 2、vector容器
    • 2.1、vector 基本操作
    • 2.2、vector容器示例
    • 2.3、vector容器存放自定义数据类型示例
    • 2.3、vector嵌套vector示例
  • 3、list 容器
    • 3.1使用示例
    • 3.2、list容器基本函数
  • 4、map容器
    • 4.1、map函数原型
    • 4.2、map函数示例

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容器示例

#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容器存放自定义数据类型示例

#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示例

#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使用示例

#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函数示例

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf文件怎么编辑?7大常用的pdf在线编辑技巧,免费好用!

编辑pdf文件通常涉及对文本、图片及其他内容的添加、删除或修改。无论您希望清除过时的信息&#xff0c;还是想为pdf文件增添一些补充材料&#xff0c;掌握几种简单有效的编辑方法都是非常重要的。因此&#xff0c;本文将为大家介绍7大常用的pdf在线编辑技巧&#xff0c;详细解…

Java学习Day40:大战亢金龙!(spring框架之AOP)

AOP&#xff08;面向切面变成&#xff09;&#xff1a;不改变原有代码的情况下&#xff0c;对代码进行功能添加 1.一些概念 抽取出的方法&#xff1a;通知 原始方法&#xff1a;成为连接点&#xff08;可以是程序执行中的任意位置&#xff09;&#xff0c;对应原始的一个个方…

Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误

在pro文件中添加以下配置即可&#xff1a; msvc{QMAKE_CFLAGS /utf-8QMAKE_CXXFLAGS /utf-8 }

哈希表、算法

哈希表 hash&#xff1a; 在编程和数据结构中&#xff0c;"hash" 通常指的是哈希函数&#xff0c;它是一种算法&#xff0c;用于将数据&#xff08;通常是字符 串&#xff09;映射到一个固定大小的数字&#xff08;哈希值&#xff09;。哈希函数在哈希表中尤为重要…

什么是浏览器指纹及其在线跟踪的用途?

互联网常常给人一种广阔的蓝色天空的感觉&#xff0c;在那里你可以自由航行&#xff0c;只有匿名才能提供这种自由。然而&#xff0c;事实并非如此。有一套工具被希望识别谁在访问其网站的企业广泛使用。这套工具被称为浏览器指纹识别&#xff0c;了解它的使用方式很重要。 一…

剑指offer JZ23 链表中环的入口结点

问题描述&#xff1a; 给定一个长度为n的链表&#xff0c;首先判断其是否有环&#xff0c;然后找到环的入口。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n)。 思路&#xff1a; 1. 投机一点的做法 从头遍历链表&#xff0c;如果有环&#xff0c;那么有些节…

Docker初识(Docker技术集群与应用)

一、基础设施即服务 IaaS&#xff08;Infrastructure as a Service&#xff09; eg&#xff1a;购买的云服务器&#xff0c;就是IaaS 提供给客户的服务是对所有设施的利用&#xff0c;包括处理、存储、网络和其他基本的计算资源。客户能够部署和运行任意软件&#xff0c;包括…

LLM大模型学习:探索LLM的精髓-理解Prompts概念与LangChain快速应用技巧”

LLM 中什么是Prompts&#xff1f;如何使用LangChain 快速实现Prompts 一 Prompt是一种基于自然语言处理的交互方式&#xff0c;它通过机器对自然语言的解析&#xff0c;实现用户与机器之间的沟通。 Prompt主要实现方式是通过建立相应的语料库和语义解析模型&#xff0c;来将自…

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…

Java方法的定义,即“函数“的定义!

方法的作用 提高代码的复用性&#xff0c;写一次&#xff0c;你需要的时候直接去调用即可。 定义一个函数方法 [修饰符1 修饰符2 ...] 返回值类型 方法名(形参){Java语句&#xff1b;... ... ... }初次接触方法的举例&#xff1a;两个整数的求和方法 根据上面的例子我们来分…

虚拟机扩充磁盘空间

本人使用的VMware首先关闭虚拟机在设置中进行磁盘扩展&#xff0c;输入扩展的空间 具体扩展步骤 fdisk /dev/sda输入p&#xff0c;查看分区情况输入n新建一个分区&#xff0c;还有之后两步&#xff0c;全部默认输入w保存分区fdisk -l使用vgdisplay查看卷组信息&#xff1a;vgdi…

动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]

目录 LeNet模型训练 LeNet 总体来看&#xff0c;LeNet&#xff08;LeNet-5&#xff09;由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成; 全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均…

Docker 清理和查看镜像与容器占用情况

查看容器占用磁盘大小 docker system df 查看单个image、container大小&#xff1a; docker system df -v 清理所有废弃镜像与Build Cache docker system prune -a

【解决内存泄漏的问题】 Qt 框架中的父子对象关系会自动管理内存,父对象会在其销毁时自动销毁所有子对象。

修改前的代码 这段代码可能会出现内存泄漏问题&#xff0c;主要原因是构造函数中创建的 LoginDialog 和 RegisterDialog 对象未在合适的地方被正确释放。具体分析如下&#xff1a; 1. 构造函数中的问题 _login_dlg new LoginDialog(); setCentralWidget(_login_dlg); _login…

【北京迅为】《STM32MP157开发板使用手册》- 第十二章 编译Linux内核

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

运算放大器中的反馈

运算放大器中的反馈&#xff1a;原理、类型与应用 运算放大器&#xff08;Operational Amplifier, 简称Op-Amp&#xff09;是现代电子电路中的重要组成部分&#xff0c;被广泛应用于信号处理、放大、滤波等场合。而反馈技术则是运算放大器电路的核心之一&#xff0c;直接影响其…

代码随想录算法训练营第二十二天| 491. 递增子序列、46. 全排列、47. 全排列Ⅱ

今日内容 Leetcode. 491 递增子序列Leetcode. 46 全排列Leetcode. 47 全排列Ⅱ Leetcode. 491 递增子序列 文章链接&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 本题也是一个子集问题&#…

【AI绘画】Midjourney后置指令--seed、--tile、--q、--chaos、--w、--no详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney后置指令--seed测试1测试2如何获取未指定种子图片的随机种子注意点 &#x1f4af;Midjourney后置指令--tile测试 &#x1f4af;Midjourney后置指令--q(or-…

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI&#xff08;简称 RVC&#xff09;模型是一个基于 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;的简单易用的语音转换框架。 具有以下特点 简单易用&a…

chrome浏览器如何设置自动播放音视频

使用场景&#xff1a; 有些场景需要打开页面后&#xff0c;自动播放视频或者视频流&#xff0c;这时候发现无法播放&#xff0c;打开浏览器控制台发现有下面的错误提示&#xff1a;NotAllowedError: play() failed because the user didnt interact with the document first 。…