C++ 序列容器Vector各种方法实现原理(带你从本质理解Vector容器)(上)

简介: C++ 序列容器Vector各种方法实现原理(带你从本质理解Vector容器)

序列容器也叫做顺序容器,序列容器各元素之间有顺序关系,每个元素都有固定的位置,除非使用插入或删除元素改变这个元素的位置。序列容器是一种线性结构的有序群集,它最重要的特点就是可以在容器一端增加和删除元素。

一.Vector容器简介

vector容器与动态数组相同,在插入或者删除元素的时候能够自动调整容器大小,即vector容器能够自动处理存储数据所需要的空间。vector容器中的元素放在连续的内存空间中,可以使用迭代器对其进行访问和遍历。

二.标准模板库中对vector容器的操作

**在使用vector容器时,需要包含vector头文件:

#incldue<vector>

1.创建vector容器

vector模板中定义了多个重载构造函数,因此vector容器的创建方式有很多种。vector容器的创建方式主要有四种:

<1>.指定容器大小

指定容器大小的格式:vector <元素类型> 对象名(容器大小);

注意这里的容器大小是指定元素类型的容器有多少个。

注意: vector容器在定义后所有元素都会被初始化,如果是基本类型数据,那么会被初始化为0,如果是其他类,则会被该类默认的构造函数完成初始化。

<2>.指定初始值

在创建vector容器时,可以同时指定vector容器大小和初始值,其格式为:

vector <元素类型> 对象名 (容器大小,元素初始值);

在这里,会将容器中所有的元素都初始化为元素初始值。

<3>.列表初始化

C++11标准还提供了另一种定中vector容器初始化的方式,即使用值的列表进行初始化,示例代码如下所示:

vector <int> v1{1,2,3,4,5,6};     //v1有六个元素
vector <int> v2={"a","b","c"};    //v2有三个元素

<4>.初始化状态为空

初始化状态为空,即创建vector容器即不指定大小也不指定初始值,示例代码如下所示:

vector <int> v1;

<5>.用一个vector容器初始化另一个vector容器

除了上述方式,vector容器还可以用另一个vector容器完成初始化,示例代码如下所示:

vector <int> v1(10,1);
vector <int> v2(v1);       //用v1初始化v2
vector <int> v3 = v2;      //用v2初始化v3

2.获取容器容量和实际元素个数

vector容器的容量与容器实际的元素个数并不一定相同(我们在后文中自己实现vector容器的时候大家自会理解),容器容量表示容器一共能存储的元素个数,是容器预分配的内存空间。而容器实际元素个数可能小于容器容量。

vector提供了两个函数capacity()size(),分别用于获取容器容量和实际元素个数,这两个函数的调用格式如下所示:

v.capacity();
v.size();

上述代码中,v是创建的vector容器。capacity()函数返回容器的容量,size()函数返回容器实际元素个数。

3.访问容器中的元素

由于vector重载了[]运算符,因此可以使用索引的方式访问vector容器中的元素。

此外,vector还提供了一个成员函数at(),用于随机访问容器中的元素。at()函数的调用方式如下所示:

v.at(int idx);

其中idx表示索引。at()函数返回值为索引指向的数据。

4.赋值函数

vector容器中的元素可以在创建容器时指定,也可以通过[]运算符来完成。除此之外vector还提供了一个成员函数assign(),用于给空的vector容器赋值。assign()函数有两种重载方式:

v.assign(n,elem);
c.assign(begin,end);

第一种形式给元素赋同样的初始值,第二种方式以指定区间给元素赋值。需要注意的是,区间是左闭右开,即第一个区间值可以使用,最后一个区间值不可使用。

5.获取头部和尾部元素

vector容器提供了front()函数与back()函数,分别用于获取容器的头,尾元素。front()函数与back()函数的调用形式如下图所示:

v.front();
c.back();

6.从尾部插入和删除元素

vector容器提供了一对函数push_back()pop_back(),分别用于从尾部添加元素和删除尾部元素,它们的调用形式如下图所示:

v.push_back(type elem& t);
v.pop_back();

7.在任意位置插入和删除元素

vector提供了像容器任意位置插入和删除元素的函数insert()erase()。其中,insert()函数用于向容器中插入元素,它有三种重载形式:

v.insert(pos,elem);           //在pos位置插入元素elem
v.insert(pos,n,elem);         //在pos位置插入n个elem元素
v.insert(pos,begin,end);      //在pos位置插入[begin,end)区间的数据


erase函数用于删除容器中的元素,它有两种重载方式:

v.earse(pos);       //删除pos位置上的元素
v.earse(begin,end); //删除[begin,end)区间上的元素


注意: insert()函数与earse()函数中的位置参数只能由begin(),end()等函数返回的迭代器只是,不能使用纯粹的数字。


相关文章
|
4天前
|
存储 C语言 C++
【C++】vector的使用上
**C++ STL的vector简介与用法:** Vector是动态顺序数组,提供高效下标访问,支持动态增长。与数组类似但可自动调整大小。常用构造函数包括默认、填充、迭代器范围和拷贝构造。析构函数自动释放内存。赋值运算符执行深拷贝。迭代器接口包括`begin()`和`end()`(反向对应`rbegin()`和`rend()`),C++11增加了const版本以支持只读访问。示例代码展示了不同构造函数和迭代器的使用。
|
5天前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
9 2
|
4天前
|
编译器 C++
【C++】vector的使用下
**C++ 中的 `std::vector` 概要:** - **元素获取:** 支持 `operator[]`(越界时不检
|
4天前
|
存储 安全 C++
|
6天前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
11天前
|
C++ 容器
【c++】优先级队列|反向迭代器(vector|list)
【c++】优先级队列|反向迭代器(vector|list)
7 0
|
21天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
100 4
|
18天前
|
前端开发 安全 数据库
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
|
5天前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
16 1
|
5天前
|
存储 监控 安全
Docker Compose:轻松实现容器编排的利器
【7月更文挑战第2天】 1. **基础与概念**:服务(多容器实例)、网络(灵活通信)、卷(数据持久化)和配置(安全管理)。 2. **实战指南**:安装Compose,编写`docker-compose.yml`文件,启动应用,并介绍依赖、环境变量、健康检查和数据持久化。 3. **最佳实践**:环境隔离、CI/CD集成、资源管理、日志监控、安全策略及案例分析,展示完整应用栈搭建。
15 1