4 c++编程-提高篇-STL简介
重新系统学习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简介的更多相关文章
- ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介
ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...
- ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...
- ROS Learning-028 (提高篇-006 A Mobile Base-04) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(不精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-04 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(不精确的制定目标位置) 我使用的虚拟机软件:VMware Workstation ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- Java提高篇---TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- 面向对象编程(C++篇4)——RAII
目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- java提高篇(八)----详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
随机推荐
- Java 多线程:并发编程的三大特性
Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...
- IDEA 修改注释的颜色
- 微信小程序-坑,wxml里wx:if 判断 数字 是否在一个数组中。
<view wx:if="{{item.index}} in {{vote_list}}"> 已赞 <image src="/static/zan_y. ...
- 如何使用Arthas定位问题
在我们日常的工作中,经常会遇到一些线上才会遇到的问题.Arthas无疑是我们在工作中,定位线上问题的神奇.下面,我将介绍一下我们在工作中经常用到的一些功能. dashboard 首先我们可以通过das ...
- 几篇关于MySQL数据同步到Elasticsearch的文章---第四篇:使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch
文章转载自: https://www.cnblogs.com/dalaoyang/p/11018541.html 1.go-mysql-elasticsearch简介 go-mysql-elastic ...
- 《Thinking In Java》作者:不要使用并发!
前言 今天纯粹就是带你们来读读书的~ 最近除了工作,特地买回了自己很喜欢的作者新发售的一本书<On Java>,作者是我的老朋友布鲁斯·埃克尔,在Java领域很有名,你可能没听过他的名字, ...
- vue3 自定义指令控制按钮权限
经过1个周的摸索和查阅资料,终于搞定VUE3中自定义指令,实现按钮级别的权限控制.当然,只是简单的对按钮进行隐藏和删除的dom操作比较容易,一直纠结的是当按钮无权限时,不是直接删除当前dom元素(bu ...
- C#-7 结构和枚举
一 什么是结构 结构是程序员定义的数据类型,有数据成员和函数成员,和类非常类似. 类是引用类型,而结构是值类型: 结构和类一样可以实现接口: 结构是隐式密封的,不能被派生: 结构类型的变量不能为nul ...
- 关于aws的ec2实例导出成ova后在vmware中的网络配置不生效的问题
在aws上的ec2实例,尤其是使用了aws市场中的ami创建的linux系统,默认情况下,网络配置都是通过dhcp自动获取的, 这周笔者将一台ec2实例(redhat/linux 8.3)导出/转换成 ...
- POJ2686 Traveling by Stagecoach (状压DP)
将车票的使用情况用二进制表示状态,对其进行转移即可. 但是我一开始写的代码是错误的(注释部分),看似思路是正确的,但是暗藏很大的问题. 枚举S,我们要求解的是dp[S][v],这个是从u转移过来的,不 ...