重新系统学习c++语言,并将学习过程中的知识在这里抄录、总结、沉淀。同时希望对刷到的朋友有所帮助,一起加油哦!

 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!

写在前面,本篇章主要简单介绍STL概念和引入,后续将分章节详细介绍。

1.1 STL的产生

  • 合理有效提高代码的复用性,是软件开发人员的追求。
  • c++的面向对象和泛型编程思想,目的就是提高代码的复用性。
  • 为了建立数据结构和算法的一套标准,产生了STL。

1.2 STL基本概念

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

1.3 STL六大组件

​编辑

1.4 容器算法迭代器介绍

了解概念后,先来利用代码感受下STL的魅力。

STL中最常用的容器为vector,可以理解为数组,下面先看下如何向vector中插入数据、遍历数据。

1.4.1 vector存放内置数据类型

我们来实现一下vector存放内置数据类型,并遍历输出

容器: vector

算法:for_each

迭代器:vector<int>::iterator

编辑

示例:


#include<iostream>
#include<string>
#include<vector>
#include<algorithm> // 使用算法 for_each时需引入 using namespace std; void myPrint(int val) {
cout << val << endl;
} void test() {
// 创建vector容器 数组
vector<int> v; // 插入数据
v.push_back(1);
v.push_back(2);
v.push_back(3); // 通过迭代器访问容器中的数据 //vector<int>::iterator it = v.begin(); // 起始迭代器,指向容器中的第一个元素
//vector<int>::iterator end = v.end(); // 结束迭代器,指向容器中最后一个元素的下一位
// 遍历1
//while (it != end) {
// cout << *it << endl; // it 看成指针,通过*it解引用,输出元素值
// it++;
//} // 遍历2 更简单的for循环输出
//for (vector<int>::iterator it = v.begin(); it < v.end(); it++) {
// cout << *it << endl;
//} // 遍历3 使用算法
// 使用STL提供标准遍历算法 头文件 algorithm
//for_each(v.begin(),v.end(), myPrint); // 遍历4 更简单
// c++11/14新特性 新的for循环——for(x:range)
// for (auto item: v) 可以用auto自动类型推导.若给定数据类型下面写法
for (int item: v) {
cout << item << endl;
}
} int main() {
test(); system("pause");
return 0;
}

1.4.2 vector存放自定义数据类型

实现一下vector存放自定义数据类型,并遍历输出

vetor内可存放自定义数据类型对象或对象指针。

示例:


#include <iostream>
#include <string>
#include<vector> using namespace std;
class Person {
public:
Person(string name, int age) {
this->m_name = name;
this->m_age = age;
} string m_name;
int m_age;
}; // vector存放对象
void test() {
vector<Person> v;
Person p1("a1", 10);
Person p2("a2", 20);
Person p3("a3", 30);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3); for (vector<Person>::iterator it = v.begin(); it < v.end(); it++) {
// 通过*it解引用拿到Person变量
//cout << "name:" << (*it).m_name << ",age:" << (*it).m_age << endl;
// it是指针,通过->来指定元素拿到变量
cout << "name:" << it->m_name << ",age:" << it->m_age << endl;
}
} // vector存放对象指针
void test2() {
vector<Person*> v;
Person p1("a1", 10);
Person p2("a2", 20);
Person p3("a3", 30);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3); for (vector<Person*>::iterator it = v.begin(); it < v.end(); it++) {
// 通过*it解引用拿到Person*,是对象指针
cout << "::name:" << (*it)->m_name << ",age:" << (*it)->m_age << endl; // 还可以通过*it解引用拿到Person*,然后**t解引用,来拿到Person对象
//cout << "name:" << (**it).m_name << ",age:" << (**it).m_age << endl;
}
}
int main() {
//test();
test2();
system("pause");
return 0;
}

1.4.3 vector容器嵌套容器

示例:


#include <iostream>
#include <string>
#include<vector> using namespace std; void test() {
// 定义一个容器嵌套容器
vector<vector<int>> v;
vector<int> v1;
vector<int> v2;
vector<int> v3; for (int i = 1; i < 4; i++) {
v1.push_back(i);
v2.push_back(i+1);
v3.push_back(i+2);
} // 将容器元素插入到容器
v.push_back(v1);
v.push_back(v2);
v.push_back(v3); // 遍历1
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
cout << *vit << " ";
}
cout << endl;
} // 遍历2
/*for (vector<int> item : v) {
for (int o : item) {
cout << o << " ";
}
cout << endl;
}*/
} int main() {
test(); system("pause");
return 0;
}

4 c++编程-提高篇-STL简介的更多相关文章

  1. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  2. ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)

    ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...

  3. ROS Learning-028 (提高篇-006 A Mobile Base-04) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(不精确的制定目标位置)

    ROS 提高篇 之 A Mobile Base-04 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(不精确的制定目标位置) 我使用的虚拟机软件:VMware Workstation ...

  4. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  5. Java提高篇---TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  6. 面向对象编程(C++篇4)——RAII

    目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...

  7. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  8. java提高篇(八)----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  9. java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  10. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

随机推荐

  1. Dart 2.18 正式发布

    互操作性增强.平台特定的网络组件.优化类型推断,以及空安全语言里程碑的近期更新 文/ Michael Thomsen, Google Flutter & Dart 产品经理 Dart 2.18 ...

  2. AlertManager 何时报警

    转载自:https://www.qikqiak.com/post/alertmanager-when-alert/ 在使用 Prometheus 进行监控的时候,通过 AlertManager 来进行 ...

  3. 云服务器 Centos7 部署 Elasticsearch 8.0 + Kibana 8.0 指南

    文章转载自:https://mp.weixin.qq.com/s/iPfh9Mkwxf5lieiqt6ltxQ 服务器是命令行模式登录,没法以浏览器方式访问.而官方推荐的快捷部署方式,在kibana ...

  4. 第一章:模型层 - 10:不返回QuerySets的API

    以下的方法不会返回QuerySets,但是作用非常强大,尤其是粗体显示的方法,需要背下来. 方法名 解释 get() 获取单个对象 create() 创建对象,无需save() get_or_crea ...

  5. 使用 openssl 生成 https 证书, 并在 nginx 中配置 https

    创建一个私钥 openssl genrsa -des3 -out server.key 2048 注意:这一步需要输入私钥,否则会提示:You must type in 4 to 1023 chara ...

  6. 组合总和 II

    组合总和 II 题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  7. img和div之间有间隙的原因及解决方法

    div 中 存在 img标签,由于img标签的 display:inline-block 属性. #####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是 ...

  8. CentOS obs直播RTMP协议推流到Nginx流媒体服务器到VUE使用HLS直播

    1. 发布打包前端管理平台(ant-design-vue) 2. 发布打包后端(.NET6-WebApi) .NET6 webAPI orm: free sql 数据库:mysql5.7 3. 发布打 ...

  9. day05多表查询01

    多表查询 前面讲过的基本查询都是对一张表进行查询,但在实际的开发中远远不够. 下面使用表emp,dept,salgrade进行多表查询 emp: dept: salgrade: 1.前置-mysql表 ...

  10. count(*), count(1), count(列名)的区别

    1.从结果上来看 count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,但count(列名)就有区别了,因为count(列名)会去过滤空值. 2.从执行 ...