重新系统学习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. Golang实现set

    背景 Golang语言本身未实现set,但是实现了map golang的map是一种无序的键值对的集合,其中键是唯一的 而set是键的不重复的集合,因此可以用map来实现set Empty 由于map ...

  2. Dockerfile中ADD命令详细解读

    ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD 源路径 目标路径 #test FROM ubuntu MAINTAINER ...

  3. 在云原生中监控JVM指标

    一般 Java 集成 Prometheus 监控指标有两种方式.一种是依赖中引入,另外一种是通过agent执行. 依赖引入 <!-- The client --> <dependen ...

  4. 【前端必会】tapable、hook,webpack的灵魂

    背景 什么是tapable.hook,平时做vue开发时的webpack 配置一直都没弄懂,你也有这种情况吗? 还是看源码,闲来无聊又看一下webpack的源码,看看能否找到一些宝藏 tapable和 ...

  5. display:block 和display:inline-block的区别和用法

    1).块状元素:(div,p,form,ul,ol,li) ,独占一行,默认情况width为100% 2).行内块状元素:(span,img,a),不会独占一行,相邻的元素一直排在同一行,排满了才会换 ...

  6. liunx的三个时间atime,mtime,ctime详细说明与使用场景

    导航:一.文件与文件夹三个时间:atime,mtime,ctime的含义二.ll命令查看文件时间三.stat命令查看文件的时间四.测试创建/修改文件的时间五.常用命令关于文件时间相关 - - - - ...

  7. 欢迎来到ktq_cpp的cnblog

    欢迎来到ktq_cpp的cnblog 初学html,可能排版有一些问题,望指教 我的洛谷博客 我的AtCoder账号

  8. C++ 栈和典型迷宫问题

    C++ 栈和迷宫问题 1. 前言 栈是一种受限的数据结构,要求在存储数据时遵循先进后出(Last In First Out)的原则.可以把栈看成只有一个口子的桶子,进和出都是走的这个口子(也称为栈顶) ...

  9. 从0开始写一个简单的vite hmr 插件

    从0开始写一个简单的vite hmr 插件 0. 写在前面 在构建前端项目的时候,除开基本的资源格式(图片,json)以外,还常常会需要导入一些其他格式的资源,这些资源如果没有第三方vite插件的支持 ...

  10. 4.RabbitMQ系列之发布/订阅模式

    我们把一个消息转发给多个消费者,这种模式称之为发布-订阅模式 1.交换器(Exchange) RabbitMq消息模式的核心思想是:一个生产者并不会直接往一个队列中发送消息,事实上,生产者根本不知道它 ...