【黑马程序员】走进STL

文章目录

  • STL初始
    • STL诞生
    • STL基本概念
    • STL六大组件
    • STL中容器、算法、迭代器
      • 容器
      • 算法
      • 迭代器
  • vector
    • vector存放内置数据类型
      • 代码示例
      • 运行结果
    • vector存放自定义数据类型
      • 代码示例
      • 运行结果
    • vector容器嵌套vector容器
      • 代码示例
      • 运行结果

STL初始

STL诞生

  • 长久以来,软件界一直希望建立一种可重复利用的东西
  • C++的面向对象和泛型编程思想,目的就是复用性的提升
  • 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生了STL

STL基本概念

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

STL六大组件

  • STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器 (配接器)、空间配置器
  • 容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据
  • 算法: 各种常用的算法,如sort、find、copy、for_each等
  • 迭代器: 扮演了容器与算法之间的胶合剂。
  • 仿函数: 行为类似函数,可作为算法的某种策略.
  • 适配器: 一种用来修饰容器或者仿函数或迭代器接口的东西
  • 空间配置器: 负责空间的配置与管理

STL中容器、算法、迭代器

容器

  • 容器:置物之所也
  • STL容器就是将运用最广泛的一些数据结构实现出来
  • 常用的数据结构:数组,链表,树,栈,队列,集合,映射表 等
  • 这些容器分为序列式容器和关联式容器两种:
    • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置.
    • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法

  • 算法:问题之解法也
  • 有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)
  • 算法分为:质变算法和非质变算法.
    • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
    • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

迭代器

  • 迭代器: 容器和算法之间粘合剂
  • 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
  • 每个容器都有自己专属的迭代器
  • 迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
  • 常用的容器中的迭代器是双向迭代器和随机访问迭代器
  • 迭代器的种类
    在这里插入图片描述

vector

  • STL中最常用的容器为Vector,可以理解为数组

vector存放内置数据类型

代码示例

  • vector基本数据类型插入遍历练习
#include <iostream>
#include <vector>using namespace std;void myPrint(int item) {cout << item << " ";
}void test() {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);cout << "当前vector大小:" << v.size() << endl;cout << "当前vector容量大小:" << v.capacity() << endl;cout << "通过迭代器访问vector中的元素:" << endl;// vector<int>::iterator 迭代器类型// v.begin() 起始迭代器,指向容器中第一个元素// v.end() 终止迭代器,指向容器中最后一个元素的下一个位置cout << "第一种遍历方式: ";vector<int>::iterator itBegin = v.begin();vector<int>::iterator itEnd = v.end();while (itBegin != itEnd) {cout << *itBegin << " ";itBegin++;}cout << endl;cout << "第二种遍历方式: ";for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;cout << "第三种遍历方式,利用STL中提供的遍历算法: ";for_each(v.begin(), v.end(), myPrint);cout << endl;v.pop_back();v.pop_back();cout << "当前vector大小:" << v.size() << endl;cout << "当前vector容量大小:" << v.capacity() << endl;
}int main() {test();return 0;
} 

运行结果

在这里插入图片描述

vector存放自定义数据类型

代码示例

  • 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 printPerson(Person p) {cout << "name: " << p.name << " " << "age: " << p.age << endl;
}void test() {vector <Person> v;Person p1("zsx1", 11);Person p2("zsx2", 12);Person p3("zsx3", 13);Person p4("zsx4", 14);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);for_each(v.begin(), v.end(), printPerson);
}int main() {test();return 0;
} 

运行结果

在这里插入图片描述

vector容器嵌套vector容器

代码示例

  • 注意:
    • 两个连续的> > 中间要加上空格,否则编译器会认为是右移运算符容易产生歧义
    • *it — 表示的事容器内部的元素vector < int >
    • vector的嵌套,本质上相当于二维数组
  • 代码示例:
#include <iostream>
#include <vector>using namespace std;void test() {// 注意两个连续的> > 中间要加上空格,否则编译器会认为是右移运算符容易产生歧义vector <vector<int> > v;vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;// 向嵌套的内部vector添加数据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);cout << "通过外部vector将所有的数据遍历一遍:" << endl;for (vector < vector < int > > ::iterator it = v.begin(); it != v.end();it++) {// *it --- 表示的事容器内部的元素vector < int >for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {cout << *jt << " ";}cout << endl;}
}int main() {test();return 0;
}

运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…

Ubuntu20.04 查看系统版本号

目录 uname -auname -vlsb_release -acat /etc/issuecat /proc/version uname -a 查看系统发行版本号和操作系统版本 uname -v 查看版本号 lsb_release -a 查看发行版本信息 cat /etc/issue 查看系统版本 cat /proc/version 查看内核的版本号

Linux系统——Nginx服务状态码总结

目录 一、1xx状态码 100 Continue 101 Switch Protocols 102 Processing 二、2xx状态码 200 OK 201 Created 202 Accepted 203 Non-Authoritative Information 204 No Content 205 Reset Content 206 Partial Content 207 Multi-Status 208 Already Reported 三…

泰山众筹:掀起一场全民参与的购物狂潮!

随着互联网的快速发展&#xff0c;传统的商业模式已经无法满足消费者的多元化需求。在这个数字化时代&#xff0c;泰山众筹模式以其独特的魅力&#xff0c;正迅速成为新零售市场的热门话题。它不仅为消费者带来了前所未有的购物体验&#xff0c;还为企业的发展注入了新的活力。…

高考杂志高考杂志社高考编辑部2023年第32期目录

高考论坛 高中数学课堂教学中创设有效情境的策略探究 黄进生; 3-5 核心素养为导向的高中物理教学探究 王丽萍; 6-8 高中化学“教、学、评”一体化教学模式的有效应用 陈燕; 9-11《高考》投稿&#xff1a;cn7kantougao163.com 新高考背景下高中英语阅读理解教学…

Offer必备算法08_二叉树dfs_六道力扣题详解(由易到难)

目录 ①力扣2331. 计算布尔二叉树的值 解析代码 ②力扣129. 求根节点到叶节点数字之和 解析代码 ③力扣814. 二叉树剪枝 解析代码 ④​​​力扣98. 验证二叉搜索树 解析代码 ⑤力扣230. 二叉搜索树中第K小的元素 解析代码 ⑥力扣257. 二叉树的所有路径 解析代码 ①…

上班族steam游戏搬砖:月薪3k,副业破万

主业是为了生存&#xff0c;副业才是更好的发展。上班族选一个合适的副业&#xff0c;不仅能让生活过得更好&#xff0c;更能增加自己的抗风险能力。steam游戏搬砖项目就是一个比较好的&#xff0c;适合上班族的副业&#xff0c;它时间灵活且变现方便&#xff0c;可以当一个长期…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

程序媛的mac修炼手册-- 小白入门Java篇

最近因为要用CiteSpace做文献综述&#xff0c;间接接触Java了。所以&#xff0c;继Python、C之后&#xff0c;又要涉猎Java了。刺激&#xff01;&#xff01; 由于CiteSpace与Java要求版本高度匹配&#xff0c;有个匹配详情明天为大家讲解。总之&#xff0c;我的Java之旅开始于…

在openEuler中通过KVM可视化安装华为FusionCompute的VRM节点

一、说明 本文是华为FusionCompute云平台配置的延续&#xff0c;是在CNA&#xff08;ComputingNode Agent&#xff0c;计算节点代理&#xff09;主机安装配置完成后&#xff0c;详细安装VRM&#xff08;Virtual Resource Manager&#xff0c;虚拟资源管理器&#xff09;节点的…

【论文阅读】ICCV 2023 计算和数据高效后门攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.主要图表4.结论 一.论文信息 论文题目&#xff1a; Computation and Data Efficient Backdoor Attacks&#xff08;计算和数据高效后门攻击&#xff09; 论文来源&#xff1a; 2023-ICCV&#xff08;CCF-A&#xff09; 论文团…

前后端分离PHP+vue+mysql城市轨道交通线路公交查询系统

医院、厕所、药店、派出所、学校、营业厅、快递、银行 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等 A.美食 快餐、中餐、自助餐、火锅、烧烤、奶…