首页 > 编程语言 >C++黑马程序员——P185-188. STL初识

C++黑马程序员——P185-188. STL初识

时间:2023-04-20 15:44:39浏览次数:42  
标签:P185 容器 begin STL back C++ Person vector push

  • P185. STL初识——STL的基本概念
  • P186. STL初识——vector存放内置数据类型
  • P187. STL初识——vector存放自定义数据类型
  • P188. STL初识——容器嵌套容器
  • P185. STL的基本概念

STL,Standard Template Library,标准模板库

STL:为了提高代码的复用性,提供一套标准的数据结构和算法

STL从广义上分为:容器(container),算法(algorithm),迭代器(iterator)

容器算法之间通过迭代器进行无缝连接

  

容器:

  

算法:

  

迭代器:

  

 

  

 

  • P186. vector存放内置数据类型

此节主要内容:

  

先看个例子:

 1 #include <iostream>
 2 using namespace std;
 3 #include <vector>
 4 
 5 //vector容器存放内置数据类型
 6 void test01()
 7 {
 8     //创建了一个vector容器(先理解为一个数组)
 9     vector<int>v;  //int为数据类型,v为容器变量名
10     //向容器中插入数据
11     v.push_back(10);  //push_back 尾插
12     v.push_back(20);
13     v.push_back(30);
14     v.push_back(40);
15     //通过迭代器访问容器中的数据
16     //迭代器暂时理解为指针
17     vector<int>::iterator itBegin = v.begin();    //起始迭代器 指向容器中第一个元素
18     vector<int>::iterator itEnd = v.end();    //结束迭代器 指向容器中最后一个元素的下一个位置
19     while (itBegin != itEnd)
20     {
21         cout << *itBegin << endl;
22         itBegin++;
23     }
24 }
25 
26 int main()
27 {
28     test01();
29     return 0;
30 }

运行结果:

  

 

第二种遍历方式:

1     //第二种遍历方式
2     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
3     {
4         cout << *it << endl;
5     }

运行结果 同上

 

第三种遍历方式:

 1 ...
 2 #include <algorithm>
 3 
 4 void MyPrint(int val)
 5 {
 6     cout << val << endl;
 7 }
 8 
 9 //vector容器存放内置数据类型
10 void test01()
11 {
12     //创建了一个vector容器(先理解为一个数组)
13     vector<int>v;
14     //向容器中插入数据
15     v.push_back(10);
16     v.push_back(20);
17     v.push_back(30);
18     v.push_back(40);
19 
20     //第三种遍历方式
21     for_each(v.begin(), v.end(), MyPrint);
22 }
23 ...

运行结果 同上

for_each模板中的关键部分:

1 for (; _UFirst != _ULast; ++_UFirst) {
2         _Func(*_UFirst);
3     } 

for_each(v.begin(), v.end(), MyPrint); 就是当v.begin() != v.end(),就执行MyPrint(*v.begin()),并且v.begin()++;

 

  • P187. vector存放自定义数据类型

此节主要内容:vector中存放自定义数据类型,并打印输出

 1 #include <iostream>
 2 using namespace std;
 3 #include <vector>
 4 #include <string>
 5 
 6 //vector中存放自定义数据类型
 7 class Person
 8 {
 9 public:
10     Person(string name, int age)
11     {
12         this->m_Name = name;
13         this->m_Age = age;
14     }
15     string m_Name;
16     int m_Age;
17 };
18 
19 void test01()
20 {
21     //创建一个Person的容器
22     vector<Person>v;
23 
24     Person p1("aaa", 10);
25     Person p2("bbb", 20);
26     Person p3("ccc", 30);
27     Person p4("ddd", 40);
28     Person p5("eee", 50);
29 
30     //向容器中添加数据
31  v.push_back(p1);
32     v.push_back(p2);
33     v.push_back(p3);
34     v.push_back(p4);
35     v.push_back(p5);
36 
37     //遍历容器中的数据
38     for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
39     {
40         cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
41         //或者
42         //cout << it->m_Name << "\t" << it->m_Age << endl;  //it可以看成Person的指针
43     }
44 
45 }
46 
47 //存放自定义数据类型 指针
48 void test02()
49 {
50     vector<Person*>v;
51 
52     Person p1("aaa", 10);
53     Person p2("bbb", 20);
54     Person p3("ccc", 30);
55     Person p4("ddd", 40);
56     Person p5("eee", 50);
57 
58     //向容器中添加数据
59     v.push_back(&p1);    //&取址
60     v.push_back(&p2);
61     v.push_back(&p3);
62     v.push_back(&p4);
63     v.push_back(&p5);
64 
65     //遍历容器中的数据
66     for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++)
67     {
68         cout << "02姓名:" << (**it).m_Name << " 年龄:" << (**it).m_Age << endl;  //两次解引用
69         //或者
70         //cout << (*it)->m_Name << "\t" << (*it)->m_Age << endl;  //it相当于Person*的指针,(*it)(解引用)相当于Person*(简单来说,就是看vector后的“<>”中的内容)
71     }
72 }
73 
74 int main()
75 {
76     test01();
77     test02();
78     return 0;
79 }

运行结果:

  

 

  • P188. 容器嵌套容器

此节主要内容:容器中嵌套容器,将所有数据进行遍历输出

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 //容器嵌套容器
 6 void test01()
 7 {
 8     vector<vector<int>>v;
 9     //创建小容器
10     vector<int>v1;
11     vector<int>v2;
12     vector<int>v3;
13     vector<int>v4;
14     //向小容器中添加数据
15     for (int i = 0; i < 4; i++)
16     {
17         v1.push_back(i + 1);
18         v2.push_back(i + 2);
19         v3.push_back(i + 3);
20         v4.push_back(i + 4);
21     }
22     //将小容器插入到大容器中
23     v.push_back(v1);
24     v.push_back(v2);
25     v.push_back(v3);
26     v.push_back(v4);
27 
28     //通过大容器,把所有数据遍历一遍
29     for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
30     {
31         //(*it)——vector<int>
32         for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
33         {
34             cout << *vit << " ";
35         }
36         cout << endl;
37     }
38 }
39 
40 int main() {
41     
42     test01();
43     return 0;
44 }

运行结果:

  

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

标签:P185,容器,begin,STL,back,C++,Person,vector,push
From: https://www.cnblogs.com/wjjgame/p/17331109.html

相关文章

  • c++ 静态编译和动态编译
      C++是一种高级编程语言,它支持两种不同的编译方式:静态编译和动态编译。下面是它们的介绍:静态编译  静态编译是将程序代码和库函数一起编译成一个可执行文件的过程。在静态编译过程中,程序代码和库函数的代码被组合在一起,形成一个独立的可执行文件,该文件可以在任何系统上运行......
  • C++ - UDP通信
    UDPUDP就比较简单了,步骤比tcp要少一些。连接过程图:  1).服务器1.初始化套接字库WORDwVersion;WSADATAwsaData;interr;​wVersion=MAKEWORD(1,1);2.创建套接字SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);3.绑定//SOCKADDR_INaddrSrv;省略了定......
  • C++ - TCP通信
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>​#pragmacomment(lib,"ws2_32.lib")准备工作:创建工程后,首先右键工程,选择属性然后选择C/C++-预......
  • 使用 OpenCV4 和 C++ 构建计算机视觉项目:1~5
    原文:BuildingComputerVisionProjectswithOpenCV4andC++协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、Open......
  • c++输出格式控制
    一.控制符需要<iomanip>头文件常用:1.保留几位有效数字:setpricision(),括号里是保留的位数2.保留几位小数:setiosflags(ios::fixed)<<setpricision(),括号里是保留的位数(注意前面半句会影响此后所有setpricision()的用法,都变成保留小数位数,不只是这一句)(直接把前半句改成......
  • 刚开始如何模仿写C/C++程序的Makefile
    对于一般工程的C/C++程序,在利用Makefile文件对其进行编译遵守下面两个规则即可:即编写的Makefile文件中,不论最后的是库文件还是可执行文件。gcc通过-c选项,将所有的文件都编译成目标代码文件即可.o文件。之后通过将所有的.o文件链表得到一个可执行文件,或者库文件。......
  • 打卡 上课铃响之后 - C/C++ 多态
    如本章开篇所述,当小学里的上课铃响之后,学生(Student)、教师(Teacher)和校长(Principal)会对同一个消息表现出不同的行为。请设计Person、Student、Teacher以及Principal类,合理安排他们之间的继承关系并将所有类的bellRing()及析构函数设计为虚函数,使得下述代码可以正常执行并产生期望的......
  • 初学者代码训练Day3(c/c++)
    题目中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只? 流程图: 代码:1#include<iostream>2usingnamespacestd;3intmain()4{intgongji,mu......
  • C++第三章课后习题3-15
    编写递归函数getPower计算x的y次方,在同一个程序中针对整形和实数型实现两个重载的函数。#include<iostream>usingnamespacestd;intgetPower(intx,inty){if(y<0){return0;}if(y==0){return1;}if(y>0){......
  • 一文掌握C/C++内存泄漏,防止内存泄漏以及检测工具!
    在写C/C++代码的时候,经常需要为程序分配动态内存,难免就会发生内存泄漏的情况,本文就来说一下如何防止C/C++内存泄漏!在说防止内存泄漏前,先说一下什么是内存泄漏。一、什么是内存泄漏?通俗一点说就是,程序中动态分配的内存并没有正确的释放。内存泄漏(Memoryleak)是在计算机科学......