一篇文章带你了解C++(STL基础、Vector)

目录
  • STL基本概念
  • STL六大组件
  • STL中容器、算法、迭代器
  • 容器算法迭代器初识
    • Vector 容器
    • Vector 三大遍历算法
    • Vector 存放其他数据类型
    • Vector 容器嵌套
  • 总结

STL基本概念

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

STL六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  • 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
  • 算法:各种常用的算法,如sort、find、copy、for_each等
  • 迭代器:扮演了容器与算法之间的胶合剂。
  • 仿函数:行为类似函数,可作为算法的某种策略。
  • 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  • 空间配置器:负责空间的配置与管理。

STL中容器、算法、迭代器

容器: 置物之所也

  • STL容器就是将运用最广泛的一些数据结构实现出来
  • 常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等

这些容器分为序列式容器和关联式容器两种:

  • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置。
  • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法 ; 问题之解法也

  • 有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)

算法分为:质变算法和非质变算法。

  • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

迭代器 : 容器和算法之间粘合剂

  • 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
  • 每个容器都有自己专属的迭代器
  • 迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针

迭代器种类:

种类 功能 支持运算
输入迭代器 对数据的只读访问 只读,支持++、==、!=
输出迭代器 对数据的只写访问 只写,支持++
前向迭代器 读写操作,并能向前推进迭代器 读写,支持++、==、!=
双向迭代器 读写操作,并能向前和向后操作 读写,支持++、–,
随机访问迭代器 读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器 读写,支持++、–、[n]、-n、<、<=、>、>=

常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

容器算法迭代器初识

Vector 容器

  • 容器: vector
  • 算法: for_each
  • 迭代器: vector<int>::iterator

Vector 三大遍历算法

第一种方法:

	vector<int>::iterator Begin = v.begin();
	vector<int>::iterator End = v.end();

	while (Begin != End) {
		cout << *Begin << endl;
		Begin++;
	}

第二种方法 :

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << endl;
	}

第三种方法 :

#include <algorithm>

void myPrintln(int val) {
	cout << val << endl;
}
for_each(v.begin(), v.end(), myPrintln);

Vector 存放其他数据类型

存放自定义数据类型 Person

void test13() {
	vector<Person> v1;
	Person p1("花丸",16);
	Person p2("善子", 17);
	Person p3("露比", 15);

	v1.push_back(p1);
    v1.push_back(p2);
	v1.push_back(p3);

	for (vector<Person>::iterator it = v1.begin(); it != v1.end(); it++) {    // *it  就是 Vector<>  内的
		cout << (*it).m_Name << " " << (*it).m_Age << endl;

	}

}

存放指针类型

void test14() {
	vector<Person*> v2;

	Person p1("小花丸", 16);
	Person p2("中善子", 17);
	Person p3("大露比", 15);

	v2.push_back(&p1);
	v2.push_back(&p2);
	v2.push_back(&p3);

	for (vector<Person*>::iterator it = v2.begin(); it != v2.end(); it++) {
		cout << (*it)->m_Name << " " << (*it)->m_Age << endl;

	}

}

Vector 容器嵌套

代码

#include <iostream>
using namespace std;
#include <string>
#include <algorithm>
#include <vector>

// 知识点 : Vector 嵌套 类似于多维数组

void test15() {
	vector<vector<int>>  v;

	vector<int> v1;
	vector<int> v2;
	vector<int> v3;

	for (int i = 0; i < 4; i++) {
		v1.push_back(i + 1);
		v2.push_back(i + 3);
		v3.push_back(i + 5);
	}

	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);

	for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
		// *it  - > vector<int>
		for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
			cout << *vit << " ";
		}
		cout << endl;
	}
}

int main() {

	test15();
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解C++ STL vector容量(capacity)和大小(size)的区别

    很多初学者分不清楚 vector 容器的容量(capacity)和大小(size)之间的区别,甚至有人认为它们表达的是一个意思.本节将对 vector 容量和大小各自的含义做一个详细的介绍. vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数:而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数. 对于一个 vector 对象来说,通过该模板类提供的 capacity() 成员函数,可以获得当前容器的容量

  • 详解C++ STL vector容器访问元素的几种方式

    学会如何创建并初始化 vector 容器之后,本节继续来学习如何获取(甚至修改)容器中存储的元素. 访问vector容器中单个元素 首先,vector 容器可以向普通数组那样访问存储的元素,甚至对指定下标处的元素进行修改,比如: #include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //获取容器中首个元素 cout &l

  • C++ STL入门教程(1) vector向量容器使用方法

    一.简介 Vectors 包含着一系列连续存储的元素,其行为和数组类似. 访问Vector中的任意元素或从末尾添加元素都可以在O(1)内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是O(N). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <vector> #include <iostream> #include <algorithm> #include <stdexcept> using namespace

  • C++(STL库)之顺序容器vector的使用

    一.特点 ①总的来说:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 ②元素保存在连续的内存空间中,因此通过下标取值非常快 ③在容器中间位置添加或删除元素非常耗时 ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效.内存重分配耗时很长 二.头文件.using声明 头文件:#include <vector> using声明:using std::vector; 三.初始化 vector<T>  v1; ==>v1是一个空的vector ve

  • C++ STL vector的模拟实现

    1. vector的介绍和使用 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效.但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理. 本质讲,vector使用动态分配数组来存储它的元素.当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间.其做法是,分配一个新的数组,然后将全部元素移到这个数组.就时间而言,这是一个相对代价高的任务,因为每当一个新

  • 一篇文章带你了解C++(STL基础、Vector)

    目录 STL基本概念 STL六大组件 STL中容器.算法.迭代器 容器算法迭代器初识 Vector 容器 Vector 三大遍历算法 Vector 存放其他数据类型 Vector 容器嵌套 总结 STL基本概念 STL(Standard Template Library,标准模板库) STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接. STL 几乎所有的代码都采用了模板类或者模板函数 STL六大组件

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章带你了解python字典基础

    目录 1. 字典基础知识 字典的基本格式表示 字典的键.值设置要求 1)键的设置要求 2)值的设置要求 2. 字典元素增加 1.利用赋值给字典增加元素 2.利用setdefault()方法给字典增加元素 3. 字典值查找 1.字典名+[key]查找 2.利用get()方法查找 4. 字典值修改 1.利用赋值修改键对应的值 2.利用update()方法修改键对应的值 5. 字典元素删除 1.利用del函数删除 2.利用pop()方法删除 3.利用popitem()方法删除 6. 字典遍历操作 1.

  • 一篇文章带你深入了解javaIO基础

    目录 一.认识IO 1.IO的分类 2.IO的方式 3.IO读写的方式 4.IO的特性 二.文件操作 1.文件的构成 2.文件的创建 3.文件操作的API使用 三.IO流 1.流的分类 2.流的创建 3.流的使用 <1>输入流 <2>输出流 <3>实例:文件的复制 总结 一.认识IO 1.IO的分类 (1)BIO:同步阻塞IO (2)NIO:同步非阻塞IO (3)AIO:异步阻塞IO 注意: 这里主要介绍BIO 2.IO的方式 IO本质就是对数据的操作 (1)网络IO

  • 一篇文章带你深入了解Java基础(3)

    目录 1.方法的基本定义 2.方法重载 3.方法的递归调用 4.面向对象的前身是面向过程 5.类与对象 总结 1.方法的基本定义 限制条件:本次所讲解的方法指的是在主类中定义,并且由主方法由主方法直接调用. 方法是指就是一段可以被重复调用的代码块. 在java里面如果想要进行方法的定义,则可以使用如下的方法进行完成. public static 方法返回值 方法名称([参数类型 变量,....]){ 方法体代码 ; return [返回值]; } 在定义方法的时候对于方法的返回值由以下两类:vo

  • 一篇文章带你了解python异常基础

    目录 1. 程序中的问题 1.1 低级语法错误 1.2 中介错误:代码存在隐性错误 1.3 高级错误:软件面对不确定性的异常错误 2. 捕捉异常 2.1 基本异常捕捉语句 2.2 带finally子句的异常处理 2.3 try-except-else 结构 2.4 try-except-else-finally 结构 2.5 捕捉特定异常信息 3. 抛出异常 总结 1. 程序中的问题 1.1 低级语法错误 低级错误纯属语法错误,代码主要在编写.调试阶段就报错. >>> if True S

  • 一篇文章带你深入了解Java基础(2)

    目录 1.Java主要特点 2.计算机的高级汇编语言类型: 3.JVM(Java Visual Machine) 4.编写第一个Java程序并运行 5.CLASSPATH指的是类加载路径 6.程序注释,对以后的所有代码都要进行注释,主页可以方便进行开发需求 7.标识符和关键字 8.Java数据类型的划分以及数据类型的操作 9.运算符 自增.自减操作 总结 1.Java主要特点 简单性.跨平台性.分布性.安全性.健壮性.平台独立与可移植性.多线程.动态性.面向对象的编程语言.支持垃圾自动收集处理等

  • 一篇文章带你深入了解Java基础

    目录 1.String类 1.1两种对象实例化方式 1.2字符串比较 1.3字符串常量是String的匿名对象 1.4String两种实例化方式区别 1.分析直接赋值方式 2.构造方法赋值 1.5字符串常量不可改变 1.6开发中String必用 1.7字符串和字符数组 1.9字符串比较 1.11字符串的替换 1.12字符串的拆分 1.12字符串的截取 1.13其他操作方法 2.1. 给定一个email地址,要求验证其是否正确,提示:可以简单的验证一下,重点验证"@"和".&q

  • 一篇文章带你深入了解Java基础(4)

    目录 1.private实现封装处理 2.构造方法与匿名对象 3.简单java类 4.数组 总结 1.private实现封装处理 如果像想要知道封装,首先必须清楚如果没有封装会怎么样? 没有封装方法中的属性,在所有方法被调用后都可以进行无权限的访问.而当进行了封装操作之后,在实例化对象访问该方法的时候会出现无法访问的问题. TestDemo1.java:11: 错误: name 在 Person 中是 private 访问控制 per.name = "张三"; ^ TestDemo1.

  • 一篇文章带你深入了解Java基础(5)

    目录 1.数组 Java对数组的支持 1.数组的排序:java.util.Arrays.sort(数组名称) 2.数组的拷贝:指的是将一个数组的部分内容替换掉另一个数组的部分内容 总结 1.数组 数组的引用传递 public class TestDemo1{ public static void main(String args[]){ int data[] = null; data = new int [3]; data[0] = 10; //第一个元素 data[1] = 20; //第二个

随机推荐