【初识STL】基本概念、vector存放内置数据类型(三种遍历方式)和自定义类型、容器嵌套容器

本文详细介绍了C++标准模板库(STL)中的基本概念,包括容器(vector,list,set,map等)、迭代器的使用以及不同类型的遍历方法。同时涵盖了vector存放内置和自定义类型,以及容器嵌套容器的示例应用。
摘要由CSDN通过智能技术生成

前言

STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。STL的设计目标是提供高效、可靠和易于使用的数据结构和算法,以便开发人员可以更轻松地编写高质量的C++代码。

STL包含了许多常用的容器类(如vector、list、set、map等),这些容器类提供了不同的数据结构,以满足不同的需求。STL还提供了一系列的算法(如排序、查找、遍历等),这些算法可以直接应用于容器类,以便进行各种操作和处理。

使用STL可以带来以下好处:

  1. 提高开发效率:STL提供了现成的数据结构和算法,可以减少开发人员编写重复代码的工作量,从而提高开发效率。
  2. 提高代码质量:STL经过广泛的测试和优化,具有高效性和可靠性。使用STL可以避免一些常见的错误,并提供更稳定的代码。
  3. 代码重用性:STL的模板类和函数可以在不同的项目中重复使用,提高代码的重用性和可维护性。
  4. 标准化:STL是C++标准库的一部分,它遵循C++标准,并得到广泛支持和使用。使用STL可以使代码更具可移植性和兼容性。

一、基本概念

STL 标准模板库 Standard Template Library
STL几乎所有的代码都采用了模板类或者模板函数

1.组成

STL

2.容器 container

STL提供的容器是常用数据结构的类模板,即实现常用数据结构
常用数据结构:数组、链表、树、栈、队列、集合、映射表等

container

序列容器提供顺序表的表示和操作。强调值的排序,序列式容器中的每个元素均有固定的位置
vector向量。可以随机访问序列中的单个元素,在序列尾快速插入和删除元素。如果在序列中插入和删除元素,则所需时间与序列长度成正比。
deque双向队列。随机访问序列中的单个元素,可以在序列头或尾快速插入和删除元素。如果在序列中插入和删除元素,则所需时间与序列长度成正比。
list双向链表。用动态链式结构存放数据,可以从任何位置快速插入和删除元素。
关联容器提供集合和映像的表示和操作。二叉树结构,各元素之间没有严格的物理上的顺序关系
set集合。重复值元素,可以实现快速查找
multiset集合。允许重复值元素,可以实现快速查找
map映射。一对一映射重复值元素,实现基于关键字的快速查找。
multimap映射。一对多映射允许重复值元素,实现基于关键字的快速查找。
容器适配器特殊顺序表
stack堆栈。后进先出(LIFO)表,只能在表头插入和删除元素。
queue队列。先进先出(FIFO)表,只能在表头删除元素,在表尾插入元素。
priority_queue优先队列。优先级最高的元素总是第一个出列。

3.迭代器 iterator

容器与算法之间的粘合剂。
迭代器是STL提供的对顺序容器和关联容器操作的模板,是功能更强、更安全的容器指针。
每一个容器都有自己的迭代器。

iterator

vector<int>::iterator p;//p被称为迭代子或迭代算子
//迭代子是指向容器类型的指针变量,用于操作容器中的元素
迭代器类型操作(p、q为迭代子,i为整数)
所有迭代器++p,p++
输入(input)*p(右值),p->(右值),p=q,p==q,p!=q
输出(output)*p(左值),p=q
正向(forward)输入和输出迭代器的全部操作
双向(bidirectional)- -p,p- -及正向迭代器的全部操作
随机(random access)p+=i,p-=i,p+i,p[i],p<q,p<=q,p>q,p>=q及双向迭代器的全部操作

4.算法 algorithm

C++的STL中包含大约70种标准算法。
这些算法是用于对容器的数据施加特定操作的函数模板
迭代器的迭代子协同访问容器中的元素。
在头文件algorithm中声明。

algorithm

二、vector存放内置数据类型(三种遍历方式)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; 
void MyPrint(int vdata)
{
	cout<<vdata<<endl;
}
void test1()
{
	//创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
	vector<int> v;//可看作数组
	//向容器中存放数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	
	//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
	//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
	
	//第一种遍历方式
	vector<int>::iterator pBegin=v.begin();
	//v.begin()返回迭代器,这个迭代器指向容器中第一个数据
	vector<int>::iterator pEnd=v.end();
	//v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
	while(pBegin!=pEnd)
	{
		cout<<*pBegin<<endl;
		pBegin++;
	}
	//第二种遍历方式
	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	cout<<*it<<endl;
	//第三种遍历方式 使用遍历算法for_each
	for_each(v.begin(),v.end(),MyPrint);
}
int main()
{
	test1();
	return 0;
}

三、vector存放自定义类型

#include<iostream>
using namespace std;
#include<vector>
#include<string>
class Person
{
public:
	Person(string name,int age)
	{
		Name=name;
		Age=age;
	}
public://不能是private 
	string Name;
	int Age;
};
//存放对象
void test01()
{
	vector<Person> v;
	Person p1("aaa",1);
	Person p2("bbb",2);
	Person p3("ccc",3);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
	cout<<(*it).Name<<" "<<it->Age<<endl;//it 指向对象的指针 
}
//放对象指针 
void test02()
{
	vector<Person*> v;
	Person p1("aaa",1);
	Person p2("bbb",2);
	Person p3("ccc",3);
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	for(vector<Person*>::iterator it=v.begin();it!=v.end();it++)
	{
		Person *p=(*it);//it 指向对象的地址的指针 
		cout<<(*p).Name<<" "<<p->Age<<endl;
	}
}
int main()
{
	test01();
	test02();
	return 0;
}

四、容器嵌套容器

二维数组

#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<3;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);
	for(vector< vector<int> >::iterator it=v.begin();it!=v.end();it++)
	{
		for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++)
		{
			cout<<*vit<<" ";
		}
		cout<<endl;
	}
}
int main()
{
	test01();
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值