STL技术——STL概述和入门

2023-05-16

文章目录

  • STL技术——STL概述和入门
    • 1、STL简介
    • 2、入门案例
      • 2.1、vecto存放内置数据类型
      • 2.2、vecto存放自定义数据类型
      • 2.3、容器嵌套

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL技术——STL概述和入门 的相关文章

  • 为什么 std::string 不是 std::vector 的特化? [复制]

    这个问题在这里已经有答案了 将字符串视为字符向量似乎是显而易见的 那么为什么 string 有它自己的特殊实现 它看起来与向量类有很大不同呢 只是为了说明这一点 这里有两个课程的一些片段 以表明所需的工作非常相似 例如两者都使用分配器来管理
  • 使用 std 算法将容器分区/批量/分块为大小相等的块

    我遇到过一种情况 我必须将一组记录批量处理到数据库中 我想知道如何才能做到这一点标准算法 给定 10002 条记录 我希望将其划分为 100 条记录的 bin 进行处理 其余为 2 条记录的 bin 希望下面的代码能够更好地说明我想要完成的
  • STL 绳索 - 何时何地使用

    我想知道在什么情况下你会在另一个STL容器上使用绳子 绳子是一根可伸缩的绳子 实施 它们是为 高效运作涉及 字符串作为一个整体 操作如 赋值 串联和 子字符串花费的时间几乎是 与长度无关 细绳 与 C 弦不同 绳索是 非常合理的代表 长字符
  • “UTF-16”和“std::wstring”有什么区别?

    这两种字符串存储格式有什么区别吗 std wstring是一个容器wchar t 的大小wchar t未指定 Windows 编译器倾向于使用 16 位类型 Unix 编译器倾向于使用 32 位类型 UTF 16 https en wiki
  • 为什么ostringstream在多线程环境下不能很好的工作

    也许有些事情很奇怪 当我在多线程环境中使用STL ostringstream 类时 我发现每个线程的执行时间随着线程数量的增加而线性增加 我不知道为什么会这样 我尝试检查 ostringstream 源代码 但找不到任何同步代码 ostri
  • 为什么编译器无法用文字确定 std::max 的模板?

    既不是 clang 也不是 gcc 编译这个 include
  • 从 char* 初始化 std::string 而不复制

    我遇到一种情况 我需要处理大量 许多 GB 数据 如下所示 通过附加许多较小的 C char 字符串来构建一个大字符串 修剪绳子 将字符串转换为 C const std string 进行处理 只读 repeat 每次迭代中的数据都是独立的
  • 在没有缓冲区的情况下将数据从 fstream 复制到 stringstream?

    无论如何 我可以从fstream 一个文件 到一个stringstream 内存中的流 目前 我正在使用缓冲区 但这需要双倍的内存 因为您需要将数据复制到缓冲区 然后将缓冲区复制到字符串流 直到删除缓冲区为止 数据都会在内存中复制 std
  • Linux 与 Windows std::map 赋值构造函数(为什么有这样的差异?)

    我在 Linux Ubuntu 中编写的 C 应用程序中目睹了一些意外行为 我将构造一个带有参数的对象 然后使用赋值运算符将该对象的副本放入 std map 中 我写了一个简单的程序来演示这种情况 include
  • 从函数返回 STL 向量 - 复制成本

    当您从函数返回 stl 向量时 vector
  • std::unordered_set 迭代器遍历的复杂性

    我最近玩了一个std unordered set http en cppreference com w cpp container unordered set 我怀疑我的 STL 版本会跟踪某些 FILO 数据结构 看起来像列表 中的非空存
  • 迭代器后继者

    我想用另一个迭代器 同类 的后继者初始化一个迭代器 任意类型 以下代码适用于随机访问迭代器 但不适用于前向或双向迭代器 Iterator i j 1 一个简单的解决方法是 Iterator i j i 但这不起作用初始化语句for 循环的
  • std::function 和 std::bind 行为

    我有这个代码 include
  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • STL容器如何复制对象?

    我知道 STL 容器 比如vector添加对象时复制该对象 push back方法如下 void push back const T x 我很惊讶地发现它把该项目作为参考 我编写了一个示例程序来看看它是如何工作的 struct Foo Fo
  • 引用计数指针的STL类?

    这应该是微不足道的 但我似乎找不到它 除非不存在这样的类 智能指针的 STL 类 或类集 是什么 UPDATE 感谢您的回复 我必须说我很惊讶没有标准实施 我最终使用了这个 http archive gamedev net referenc
  • 如何从 wfstream 读取二进制数据?

    我从文件读取数据时遇到一个小问题 我希望能够读取 wstring 以及任意大小的原始数据块 大小以字节为单位 std wfstream stream file c str std wstring comType stream gt gt c
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 带有自定义分配器的 std::string

    所以我目前正在编写一个内存调试器 为此我需要 stl 容器对象来使用未跟踪的分配器 我的整个代码库中都散布了 std string 因此我将其键入以使用未跟踪的分配器 typedef std basic string

随机推荐

  • PELCO-D与PELCO-P协议介绍

    一般控制协议都由硬件或软件商编制在程序里面 xff0c 我们只需要通过相关的控制设备来进行操作 但是作为一个从事监控行业的技术人员 xff0c 往往会遇到除了电脑和协议转换器以外根本没有任何控制设备的情况 xff0c 此时 xff0c 协议
  • ROS 问题(topic types do not match、topic datatype/md5sum not match、msg xxx have changed. rerun cmake)

    1 topic types 不匹配 使用 roslaunch 命令 roslaunch carla ros bridge carla ros bridge with example ego vehicle launch 启动官方 demo
  • Ubuntu中查看安装的Python版本以及不同版本之间切换

    查看系统中已安装的所有Python版本 使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 xiyou 64 span class token property xiyou virtual machine span
  • Ubuntu Python 多版本安装

    概述 由于 Python 3 有几次较为跳跃的更新 xff0c 导致大量使用 Python 3 作为开发工具的软件会对 Python 3 的版本进行严格限制 xff0c 如限制使用 Python 3 8 Python 3 9 版本 这要求开
  • 怒爬某 Hub 资源就为撸了一个鉴黄平台

    来源 xff1a 码匠笔记公号 黄色已经是我们所不容然而却防不胜防的 xff0c 尤其是对于做内容的工具和平台 xff0c 所以花了30分钟搭建了一个鉴黄平台 xff0c 分享给大家 数据准备 找了 N 多资源都不能解决问题 xff0c 于
  • ROSERROR : datatype/md5sum

    出错原因是 xff1a 自定义消息 xff0c 发送话题的消息类型和接受话题的消息类型不一样 但是我的代码真的是一样的 所以 xff0c 解决办法是 xff1a 清空工作空间的build devel文件夹 xff0c 重新编译运行 成功 x
  • 学习使用 ArUco 标记

    在本文中 xff0c 我们将研究使用 Python 和 OpenCV 检测和估计 ArUco 标记的方向 首先 xff0c 我们将从生成 ArUco 标记开始 你可以使用特定网站一个一个地创建单个标签 xff0c 也可以使用我的程序生成整个
  • TCP协议中的序列号

    TCP 协议工作在OSI的传输层 xff0c 是一种可靠的面向连接的数据流协议 xff0c TCP之所以可靠 xff0c 是因为它保证了传送数据包的顺序 顺序是用一个序列号来保证的 响应包内也包括一个序列号 xff0c 表示接收方准备好这个
  • c++开发过程中遇到的问题及解决方案

    xfeff xfeff 问题一 xff1a 1 gt JForm obj error LNK2019 无法解析的外部符号 34 public virtual thiscall JFC JForm JForm void 34 1JForm 6
  • Digest Auth 摘要认证

    Digest Auth 摘要认证 1 非常规方式 转载 xff1a https blog csdn net qq 25391785 article details 86595529 public static void postMethod
  • 嵌入式C语言基础知识--位操作

    目录 大小端模式 xff1a 字节高低位 xff1a LSB和MSB xff1a 高位先行msb 低位先行lsb xff1a 串口传输是低位先行 IIC传输是高位先行 字节序 比特序 大端模式 小端模式 高字节序 低字节序 MSB LSB
  • qt 绘制 流程图 案例 收集

    参考 C 43 43 中的例子 xff1a Qt Qt5 11 1 Examples Qt 5 11 1 widgets graphicsview diagramscene The Diagram Scene example is an a
  • 获得GPS数据的两种方法 1.读串口

    获得GPS数据一般可通过两种方法 xff0c 读串口及调用gpsapi函数 串口作为硬件设备 xff0c 不能同时被两个程序占用 xff0c gpsapi函数几个应用程序可同时共享端口 1 xff0e 读串口 先找出 gps 使用的串口号
  • 机器人履带底盘的悬挂和传动

    我爸是坦克 xff01 一个履带机器人 一 前言 曾经调研过机器人履带底盘的设计和构造 xff0c 整理一下备忘 本文主要关注自己比较难理解的履带底盘悬挂机构和摇臂式履带底盘传动机构 其中履带底盘的悬挂涉及到克里斯蒂悬挂 xff08 Chr
  • Python爬虫——Scrapy 的基本使用

    文章目录 Python爬虫 Scrapy 的基本使用1 创建 Scrapy 爬虫项目2 Scrapy 创建爬虫文件3 Scrapy 运行爬虫文件 Python爬虫 Scrapy 的基本使用 Scrapy 框架中创建项目 查看配置信息 xff
  • Python爬虫——Scrapy框架使用实例及执行过程

    文章目录 Python爬虫 Scrapy框架使用实例及执行过程1 Scrapy框架使用实例2 Scrapy框架执行过程 Python爬虫 Scrapy框架使用实例及执行过程 1 Scrapy框架使用实例 1 创建scrapy项目 scrap
  • C++基础入门

    文章目录 C 43 43 基础入门1 变量和常量2 关键字3 数据类型4 流程控制5 数组6 函数7 指针8 结构体 C 43 43 基础入门 1 变量和常量 变量和常量 变量 xff1a 数据类型 变量名 61 值 常量 xff1a 宏常
  • 解决CLion的 CMake executable not found:XXX

    解决CLion的 CMake executable not found XXX 问题 CLion不能编译DeepStream项目 xff0c 也不能 build 和 debug了 xff0c 还出现以下提示 xff1a 原因 原因是 cli
  • C++核心编程

    C 43 43 核心编程 1 c 43 43 内存模型 c 43 43 程序执行时将内存大致分为4个区域 代码区 xff1a 存放CPU执行的二进制代码指令 xff0c 由操作系统进行管理全局区 xff1a 存放全局变量和静态变量以及全局常
  • STL技术——STL概述和入门

    文章目录 STL技术 STL概述和入门1 STL简介2 入门案例2 1 vecto存放内置数据类型2 2 vecto存放自定义数据类型2 3 容器嵌套 STL技术 STL概述和入门 1 STL简介 STL介绍 STL xff08 stand