C++提高编程之STL初始

1.STL的诞生

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

2,STL的基本概念

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

3,STL的六大组件

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

4,STL的容器,算法,秩代器

容器:置物之所也
STL容器就是将运用最广泛的一些数据结构实现出来
常用的数据结构:数组,链表,树,栈,队列,集合,映射表 等

这些容器分为序列式容器和关联式容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置

关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

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

迭代器:容器和算法之间粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式
每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初学阶段我们可以先理解选代器为指针

 常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

5,STL的算法秩代器初始

STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器

5.1 vector存放内置数据类型

容器:vector

算法:for_each

秩代器:vector<int>::iterator

示例:

1,vector容器的创建

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void test01()
{//创建一个vector容器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 inEnd = v.end();//结束秩代器 指向容器中最后一个给元素的下一个位置
}int main()
{system("pause");return 0;
}

2,对于起始秩代器和结束秩代器的解释: 

3,遍历方式

//第一种遍历方式
//while (itBegin != itEnd)
//{
//    cout << *itBegin << endl;
//    itBegin++;
//}
//第二种遍历方式for (vector<int>::iterator it = v.begin() != v.end(); it++){cout << *it << endl;}
//第三种遍历方式
void myPrint(int val)
{cout << val << endl;
}test()
{
for_each(v.begin(), v.end(), myPrint);
}

5.2 vector存放自定义数据类型

学习目标:vector中存放自定义数据类型,并打印输出

1,存放对象

//vector存放自定义数据类型
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};void test01()
{vector<Person>v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);Person p5("eee", 50);//向容器中添加数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);//遍历数据for (vector<Person>::iterator it = v.begin(); it != v.end(); it++){cout << "姓名:" << (*it).m_name <<"\t" << "年龄:" << (*it).m_age << endl;}
}int main()
{test01();system("pause");return 0;
}

 2,存放指针对象

//放对象指针
//vector存放自定义数据类型
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};void test02()
{vector<Person*>v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);Person p5("eee", 50);//向容器中添加数据v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);v.push_back(&p5);//遍历数据for (vector<Person>::iterator it = v.begin(); it != v.end(); it++){Person* p = (*it);cout << "姓名:" << (*it).m_name << "\t" << "年龄:" << (*it).m_age << endl;}
}int main()
{test02();system("pause");return 0;
}

 

5.3  vector容器嵌套容器

示例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>void test01()
{//创建大容器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()
{test01();system("pause");return 0;
}

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

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

相关文章

HashMap 集合源码分析

系列文章目录 文章目录 系列文章目录前言谈一谈HashMap的红黑树节点类 TreeNode 设计一、字段分析二、构造方法分析三、内部类分析四、方法分析五、扩容分析六、总结 前言 HashMap 底层是使用了 哈希表&#xff08;数组实现的哈希表&#xff09; 链表 红黑树 实现的&#xff…

3.30学习日志

数值稳定性 神经网络的梯度 t表示层&#xff0c;h^t是隐藏层&#xff0c;y是要优化的目标函数&#xff0c;不是预测还包括了损失函数 损失函数l关于参数Wt的梯度&#xff1a;由链式法则&#xff0c;损失函数l关于最后一层隐藏层求导*最后一层隐藏层对倒数第二层隐藏层求导*……

全排列问题(输入整数N,生成从1~N所有整数的全排列)

【问题描述】输入整数N( 1 < N < 10 )&#xff0c;生成从1~N所有整数的全排列。 【输入形式】输入整数N。 【输出形式】输出有N!行&#xff0c;每行都是从1~N所有整数的一个全排列&#xff0c;各整数之间以空格分隔。各行上的全排列不重复。输出各行遵循"小数优先&q…

sql注入---Union注入

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 学习目标 了解union注入过程中用到的关键数据库&#xff0c;数据表&#xff0c;数据列sql查询中group_concat的作用使用union注入拿到靶机中数据库里的所有用户名和密码 一. 获得数据库表名和列…

电脑win10系统更新后开机很慢,更新win10后电脑开机怎么变慢了

很多用户反映&#xff0c;更新win10后电脑开机怎么变慢了呢?现在动不动就要30几秒&#xff0c;以前都是秒开机的&#xff0c;要怎么设置才能提高开机速度?小伙伴们别着急&#xff0c;主要原因可能是关机设置中没有勾选启用快速启动&#xff0c;或者是开机启动设置的问题&…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【数据结构】非线性结构---二叉树

1、树 1.1 树的相关概念 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b; 如上图&#xff1a;A的为6 叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b; 如上图&#xff1a;B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…

AJAX —— 学习(一)

目录 一、原生 AJAX &#xff08;一&#xff09;AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 &#xff08;二&#xff09;XML 介绍 1.理解 2.作用 &#xff08;三&#xff09;AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 &#xff08;一&#xff09;HTTP 介…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统&#xff08;包括Linux、BSD以及其他遵循POSIX标准的操作系统&#xff09;进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中&#xff0c;网络编程通常涉及到以…

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1&#xff1a;运行查看有什么可以快捷使用的&#xff0c;更新了些什么&#xff0c;可不可以直接复制粘贴 主要内容&#xff1a;在web端中模拟手机类型的点击长按操作&#xff0c;不能直接运行在安卓与io…

如何查询网站是否被搜索引擎收录

怎么看网站有没有被百度收录 对于网站所有者来说&#xff0c;了解自己的网站是否被百度搜索引擎收录是非常重要的。只有被收录&#xff0c;网站才能在百度搜索结果中展现&#xff0c;从而获取流量和曝光。下面介绍几种方法&#xff0c;让您快速了解自己的网站是否被百度收录。…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…