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众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
随机推荐
- 批量修改DNS记录的TTL值
最近有个需求,需要修改Windows DNS服务器上区域下所有A记录的TTL值.原先默认的TTL是1小时.也就是说,其它DNS服务器会缓存查询到的记录1个小时.对于近期需要大量修改记录的情况来说这样生 ...
- Openstack Neutron : LBaaS v2
目录 - LBaaS v2 - 负载均衡概念 - 服务器池 Pool - 监听器 Listener - L7 转发策略 l7 policy - 负载均衡算法 Algorithms - 健康监测 Mon ...
- Mysql 安全加固经验总结
本文为博主原创,转载请注明出处: 目录 1.内网部署Mysql 2. 使用独立用户运行msyql 3.为不同业务创建不同的用户,并设置不同的密钥 4.指定mysql可访问用户ip和权限 5. 防sql ...
- KMP&Z函数详解
KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...
- 题解 P2471 【[SCOI2007]降雨量】
原题传送门 前置芝士 离散化 ST表和RMQ问题 二分 正文 首先我们来分析一下题意. 题目会给出两个大小为 \(n\) 的数组,\(y\) 和 \(r\) ,其中 \(y_i\) 表示第 \(i\) ...
- Django 运行报异常:AttributeError: 'str' object has no attribute 'get'
Technorati Tags: Python,Django,Web 在使用django.contrib.auth用户机制进行用户的验证.登录.注销操作时,遇到这个异常. 首先是写了一个登录的视图,要 ...
- Centos7.6内核升级
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483766&idx=1&sn=4750fd4e ...
- 第一个Django应用 - 第三部分:Django视图和模板
一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...
- Git Review + Gerrit 安装及使用完成 Code-Review
转载自:https://cloud.tencent.com/developer/article/1010615 1.Code Review 介绍 Code Review 代码评审是指在软件开发过程中, ...
- Xorg+LXDE迁移到Xwayland(同时支持Waydroid和Wine)记录
系统环境: Debian bullseye Display Manager:无 桌面环境:LXDE Xorg 为什么使用Xwayland Wayland+Xwayland可以很好的支持Wayland ...