IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> STL技术——STL概述和入门 -> 正文阅读

[C++知识库]STL技术——STL概述和入门

STL技术——STL概述和入门

1、STL简介

STL介绍

STL( standard template library),译为标准模板库或者泛型库,是 C++ 提供的一个基础模板的集合。

STL 已完全被内置到支持 C++ 的编译器中,不用另外安装。

STL广义上可以分为:容器container(本质上就是封装有数据结构的模板类)、算法algorithm、迭代器iterator;容器和算法之间通过迭代器无缝连接。

STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供,并且STL几乎所有代码都采用了模板类或模板函数。

STL版本

因为STL是开源的,所以各个 C++ 编译器厂商在此标准的基础上都实现了满足自己需求的 C++ STL 泛型库,主要包括 HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等。

STL六大组件

STL大体分为6大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  • 容器:各种数据结构,如vector(常用)、list、deque、set、map等,用来存放数据

  • 算法:各种常见的算法,如sort、find、copy、for_each等

  • 迭代器:扮演了容器和算法之间的粘合剂

  • 仿函数:行为类似于函数,可做算法的某种策略

  • 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西

  • 空间配置器:负责空间的配置和管理

容器种类和功能

序列式容器:主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。由于元素在容器中的位置与元素的值没有关系,也就是说,容器没有被排列好,因此被称作序列式容器。当我们将一个元素插入到一个容器中时,要指定该元素所在的位置。

排序式容器:包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。在排序容器中,元素的预设顺序是从小到大,即使是在插入一个元素时,它们也会被插入到合适的地方。因此,当查询时,性能方面关联容器表现得很好。

哈希式容器:C++11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射和 unordered_multimap 哈希多重映射。哈希式容器和排序容器不同的地方在于:哈希容器中的元素是未排序的,元素的位置由哈希函数确定。

2、入门案例

2.1、vecto存放内置数据类型

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

//回调函数
void myPrint(int val)
{
	cout << val << endl;
}

void test1()
{
	//创建int类型的容器
	vector<int> v;
	//添加元素
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
    
	//遍历容器方式一:
	//起始迭代器,指向容器第一个元素
	//vector<int>::iterator itBegin = v.begin();
	//结束迭代器,指向容器最后一个元素的下一个位置
	//vector<int>::iterator itEnd = v.end();
	//while (itBegin!= itEnd)
	//{
	//	cout << *itBegin << endl;
	//	itBegin++;
	//}
	
    //遍历容器方式二(常用):for循环
	//for (vector<int>::iterator itBegin  = v.begin(); itBegin!=v.end(); itBegin++)
	//{
	//	cout << *itBegin << endl;
	//}
	
    //遍历容器方式三:foreach算法
	for_each(v.begin(), v.end(), myPrint);
	
}

int main()
{
	test1();
	system("pause");
	return 0;
}

push_back:在 vector 容器尾部添加一个元素

2.2、vecto存放自定义数据类型

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//vector存放自定义数据类型
class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

void myPrint(Person p)
{
	cout << "姓名为" << p.m_Name << " 年龄为" << p.m_Age << endl;
}

void test01() {
	Person p1("qq", 12);
	Person p2("wq", 13);
	Person p3("eq", 14);
	Person p4("rq", 15);
	Person p5("tq", 16);

	vector<Person> v;
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);

	for_each(v.begin(), v.end(), myPrint);

}

//存放自定义数据类型的指针
void test02() {
	Person p1("qq", 12);
	Person p2("wq", 13);
	Person p3("eq", 14);
	Person p4("rq", 15);
	Person p5("tq", 16);

	vector<Person*> v;
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	v.push_back(&p5);

	vector<Person*>::iterator itBegin = v.begin();
	vector<Person*>::iterator itEnd = v.end();

	for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
		cout << "姓名为" << (*it)->m_Name << " 年龄为" << (*it)->m_Age << endl;

	}
}
int main() {
	test01();
	cout << "-----------------------" << endl;
	test02();
	system("pause");
	return 0;
}

2.3、容器嵌套

#include<iostream>
using namespace std;
#include<vector>

//vector嵌套容器
void test03() {
	vector<vector<int>> v;
	//创建小容器
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;
	for (int i = 0; i < 4; i++) {
		v1.push_back(i + 1);
		v2.push_back(i + 2);
		v3.push_back(i + 3);
		v4.push_back(i + 4);
	}
	//把小容器放到大容器中
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);

	for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
        //(*it)----vector<int>
		for (vector<int>::iterator vIt = (*it).begin(); vIt != (*it).end(); vIt++) {
			cout << *vIt << " ";
		}
		cout << endl;
	}
}
int main() {
	test03();
	system("pause");
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:33:07  更:2022-09-30 00:35:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:21:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码