[C++] std::vector

2023-05-16

std::vector

template < class T, class Alloc = allocator<T> > class vector; // generic template

vector是表示可以改变大小的数组的序列容器。

就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。

在内部,向量使用动态分配的数组来存储它们的元素。当插入新元素时,可能需要重新分配该数组以增加大小,这意味着分配一个新数组并将所有元素移至该数组。就处理时间而言,这是一项相对昂贵的任务,因此,向量不会在每次将元素添加到容器时重新分配。

相反,向量容器可能会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能大于包含其元素所严格需要的存储空间(即它的大小)。库可以实施不同的增长策略来平衡内存使用和重新分配,但无论如何,重新分配应该只发生在对数增长的大小间隔上,以便可以为向量末尾的单个元素插入提供摊销常数时间复杂性(参见push_back)。

因此,与数组相比,向量消耗更多内存以换取管理存储和以有效方式动态增长的能力。

与其他动态序列容器(deques、list和forward_lists)相比,vector 访问其元素(就像数组一样)非常有效,并且从其末尾添加或删除元素也相对有效。对于涉及在结尾以外的位置插入或删除元素的操作,它们的性能比其他操作更差,并且迭代器和引用的一致性不如列表和forward_lists。

容器属性

序列

     序列容器中的元素按严格的线性顺序排序。单个元素通过它们在此序列中的位置进行访问

动态数组

        允许直接访问序列中的任何元素,甚至通过指针算术,并在序列末尾提供相对快速的元素添加/删除。

分配器感知

        容器使用分配器对象来动态处理其存储需求。

模板参数

T
只有保证T 在移动时不会抛出,实现才能优化移动元素而不是在重新分配期间复制它们。
别名为成员类型vector::value_type。

Alloc

用于定义存储分配模型的分配器对象的类型。默认使用分配器类模板,它定义了最简单的内存分配模型,并且与值无关。
别名为成员类型vector::allocator_type。

 构造函数

// construct/copy/destroy:
explicit vector(const Allocator& = Allocator()); //默认构造函数 构造一个没有元素的空容器
    
explicit vector(size_type n);   
vector(size_type n, const bool& value,const Allocator& = Allocator());
//构造一个包含n 个元素的容器。每个元素都是val的副本(如果提供)

template <class InputIt>
     vector(InputIt first, InputIt last,const Allocator& = Allocator());
//范围构造函数 
//构造一个包含与范围[first,last)一样多的元素的容器,每个元素都从该范围内的对应元素以相同的顺序emplace 构造。
    
vector(const vector<bool,Allocator>& x); 
vector(const vector&, const Allocator&);//拷贝构造函数

vector(vector&& x); 
vector(vector&& x, const Allocator&);
//构造一个获取x元素的容器 可看作二维数组
//如果指定了alloc并且与x的分配器不同,则移动元素。否则,不构造任何元素(它们的所有权直接转移)。
//x处于未指定但有效的状态。
    
vector(initializer_list<bool>, const Allocator& = Allocator());
//初始化列表构造函数

迭代器

// iterators:
//负责返回指向第一个元素(或第一个字符的迭代器)。 
iterator                begin() noexcept;   
const_iterator          begin() const noexcept;

//负责返回容器(或者string)“尾元素的下一个位置”的迭代器
iterator                end() noexcept;
const_iterator          end() const noexcept;
 
//将vector反转后的开始指针返回(其实就是原来的end-1)
reverse_iterator        rbegin() noexcept;
const_reverse_iterator  rbegin() const noexcept;

//将vector反转构的结束指针返回(其实就是原来的begin-1)
reverse_iterator        rend() noexcept;
const_reverse_iterator  rend() const noexcept;
 
//为了便于得到const_iterator类型的返回值,C++11引入了cbegin和cend
//用法与begin和end相同,但返回的只能是const_iterator类型。
const_iterator          cbegin() const noexcept;
const_iterator          cend() const noexcept;
const_reverse_iterator  crbegin() const noexcept;
const_reverse_iterator  crend() const noexcept;

 容量

 // capacity:

size_type size() const noexcept;    //返回容器大小
size_type max_size() const noexcept;//返回容器最大大小

void resize(size_type sz);
void resize(size_type sz, const bool& c); //为容器扩容

size_type capacity() const noexcept; //返回当前为vector分配的存储空间的大小,以元素表示

[[nodiscard]] bool empty() const noexcept; //判断容器是否为空

void reserve(size_type n); //请求更改容量 要求向量容量至少足以包含n个元素

void shrink_to_fit(); //请求容器减小其容量以适应其大小
//这可能会导致重新分配,但对向量大小没有影响并且不能改变其元素

元素访问

reference       operator[](size_type n);
const_reference operator[](size_type n) const; //重载[] 下标访问

reference       at(size_type n);
const_reference at(size_type n) const;  //会进行边界检查,若越界会抛出out_of_range异常

reference       front();    
const_reference front() const;    //访问第一个元素

reference       back();
const_reference back() const;    //访问最后一个元素

 修改

// modifiers:

//在容器末尾插入一个新元素 将容器大小增加1
template <class... Args> void emplace_back(Args&&... args);
void push_back(const bool& x);
void push_back(bool&& x);

//删除容器末尾的元素 并且将容器大小减小1
void pop_back();

//往容器中插入元素
template <class... Args> iterator emplace(const_iterator position, Args&&... args);
iterator insert(const_iterator position, const bool& x);
iterator insert(const_iterator position, bool&& x);
iterator insert(const_iterator position, size_type n, const bool& x);
template <class InputIt>
iterator insert (const_iterator position, InputIt first, 
                    InputIt last);
iterator insert(const_iterator position, initializer_list<bool>);
 
//删除元素
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

//交换两个容器的元素
void     swap(vector<bool,Allocator>&);
static void swap(reference x, reference y) noexcept;

void     flip() noexcept;// flips all bits 翻转0 1
void     clear() noexcept;// 清空容器

  例子1 - 构造

#include <iostream>
#include <vector> //std::vector

int main() {
	// constructors used in the same order as described above:
	std::vector<int> first;                                // empty vector of ints
	std::vector<int> second(4, 100);                       // four ints with value 100
	std::vector<int> third(second.begin(), second.end());  // iterating through second
	std::vector<int> fourth(third);                        // a copy of third
	
	// the iterator constructor can also be used to construct from arrays:
	int myints[] = { 16,2,77,29 };
	std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

	std::cout << "The contents of fifth are:";
	for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it) {
		std::cout << ' ' << *it;
	}
	//output : The contents of fifth are: 16 2 77 29	
	std::cout << '\n';
	std::vector<std::vector<int> > sixth(4, fifth);   //four vector<int> with value fifth
	std::cout << "The contents of sixth are:\n";
	for (std::vector<std::vector<int> >::iterator it1 = sixth.begin(); it1 != sixth.end(); ++it1) {
		std::vector<int> tmp = *it1;
		for (std::vector<int>::iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
			std::cout << *it2 << ' ';
		}
		std::cout << '\n';
	}
	/*output:
	The contents of sixth are:
	16 2 77 29
	16 2 77 29
	16 2 77 29
	16 2 77 29
	*/
	return 0;
}

例子2 - 容量

#include <iostream>
#include <vector> //std::vector

int main() {
    std::vector<int> v(10);
    std::cout << "v.empty() = " << (v.empty() ? "true\n" : "false\n");
    std::cout << "v.size() = " << v.size() << '\n';
    std::cout << "v.max_size() = " << v.max_size() << '\n';
    std::cout << "v.front() = " << v.front() << '\n';
    std::cout << "v.back() = " << v.back() << '\n';
    v.reserve(15); //预留容量15
    std::cout << "v.capacity() = " << v.capacity() << '\n'; // 15
    v.shrink_to_fit(); //缩小容器大小适应当前
    std::cout << "v.capacity() = " << v.capacity() << '\n'; //10
    return 0;
}

 例子3-访问与修改

#include <iostream>
#include <vector> //std::vector

int main() {
    //example3 - element access and modifiy
    std::vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        vec.push_back(i);   //尾部添加元素
    }
    vec.emplace_back(10);   //尾部添加元素
    std::cout << "The element of vec : ";
    for (auto &x: vec) {
        std::cout << x << ' ';
    }
    std::cout << '\n';
    std::cout << "vec[7] = " << vec[7] << '\n';
    std::cout << "vec.at(7) = " << vec.at(7) << '\n';
    //std::cout << "vec.at(13) = " << vec.at(13) << '\n';
    //std::cout << "hello world" << '\n';

    vec.insert(vec.begin(), -1); //在指定位置插入元素
    std::cout << "The elements of vec after inserting -1 in vec.begin() : ";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n';
    vec.pop_back();
    std::cout << "The elements of vec after pop_back() : ";
    for (auto &x: vec) {
        std::cout << x << ' ';
    }
    std::cout << '\n';
    std::cout << "The elements of vec after erasing the index from 0 to 6 : ";
    vec.erase(vec.begin(), vec.begin() + 6);
    for (auto &x: vec) {
        std::cout << x << ' ';
    }
    std::cout << '\n';
    vec.clear();//清空容器
    std::cout << "the vec.size() after clearing : " << vec.size();
    return 0;
}

参考

Reference - C++ Reference

C++ 教程_w3cschool

DevDocs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C++] std::vector 的相关文章

  • 从向量中删除元素在 R 中出现的时间量

    我想从一个向量中删除元素在另一个向量中出现的时间 就像我要减去它们一样 鉴于我想要删除的元素向量中的每个元素也存在于我想要从中删除的主向量中 a lt c A B B C C C b lt c A B C C a a in b return
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何在 C++ 中获取两个向量共有的字符?

    我正在尝试比较两个向量对象 并返回一个包含两个向量中出现的所有字符的向量 如果不编写一些非常复杂的手动方法 将第一个向量中的每个字符与第二个向量中的每个字符进行比较 并使用 if 将其添加到第三个向量 如果它们匹配 将返回 我将如何解决这个
  • 如何从 C++ std::basic_ostream 派生并使 << 运算符虚拟?

    我正在编写一个具有各种消息输出的类 我想让这个类变得通用并且独立于平台 所以我正在考虑通过一个基本流引用它 它可以将所有消息转储到流中 通过这样做 如果该类在控制台程序中使用 我可以通过std cout并显示在控制台窗口中 或者我可以将派生
  • 如果元素 id 与搜索参数匹配,如何从 std::vector 中删除元素

    我正在尝试编写一种算法 如果项目 ID 与参数匹配 该算法将搜索项目向量并从项目向量中删除项目 请参阅下面的示例代码 struct item item int newID id newID bool operator const item
  • 用线性增加的值填充向量

    我会用线性增加的值填充 初始化一个向量 例如 对于这个向量中的每个元素 我希望下一个是a比以前更多 或者kth元素的值为k a 像这样的东西 float a 1 132 vector
  • 在 C++ 头文件中声明向量

    我在制作的 C 类的头文件中的向量声明时遇到一些问题 我的整个头文件如下所示 ifndef PERSON H define PERSON H include Message h include
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 在类中创建向量然后在函数中使用类对象不起作用

    我有课Employees 我试图让用户插入和删除员工 但它不起作用 向量的大小应为 500 class Employees public int maxx 500 vector
  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 在显式实例化 vector 时,someType 默认构造函数的用途是什么?

    这是一个练习 来自C 入门第五版 练习 16 26 假设 NoDefault 是一个没有 默认构造函数 我们可以显式实例化吗vector
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • 使用 PHP 创建矢量图形

    我正在尝试用 PHP 创建矢量图形 我试过开罗 但没能让它发挥作用 我知道 imageMagick 具有矢量功能 但 php net 上的文档非常差 有人可以引导我走向正确的方向吗 这个想法是能够将图形保存到 EPS 我还需要能够使用不同的
  • 带有向量的 unique_ptr:错误:调用 XXX 的隐式删除复制构造函数

    我想管理一个二维数组 如下所示 std vector
  • 更快的四元数向量乘法不起作用

    我的数学库需要一个更快的四元数向量乘法例程 现在我正在使用规范v qv q 1 它产生的结果与向量乘以由四元数组成的矩阵相同 所以我对它的正确性充满信心 到目前为止 我已经实现了 3 种替代 更快 的方法 1 我不知道我从哪里得到这个 v
  • 将 2D 矢量转换为 2D 数组

    自从我上次访问数组以来已经有一段时间了 我最近一直在使用向量 我需要将 2D 向量转换回 2D 数组 因为我正在使用的库接受类型的参数double array该数组的访问器在哪里foo i j 例如 这是我的代码 double setupH
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 如何过滤自定义结构体的向量?

    我正在尝试过滤Vec

随机推荐

  • Jmeter性能测试(4)---HTTP请求详解

    jmeter xff08 四 xff09 HTTP请求 启动jmeter xff0c 建立一个测试计划 启动 xff1a 打开jmeter文件夹 xff0c bin文件 jmeter bat xff08 Windows执行文件 xff09
  • C语言和C++的区别和联系

    C语言虽说经常和C 43 43 在一起被大家提起 xff0c 但可千万不要以为它们是一种编程语言 我们来介绍C语言和C 43 43 中的区别和联系 首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是
  • 字符串的定义及何时添加‘\0‘问题

    定义字符串的六种形式 xff1a char arr 61 34 hello world 34 原理 xff1a 字符串常量的值本质上是第一个字符的地址 char arr arr 61 34 hello world 34 的改写 char a
  • 什么是云技术?

    云技术是指在广域网或局域网内将硬件 软件 网络等系列资源统一起来 xff0c 实现数据的计算 储存 处理和共享的一种托管技术
  • 深度学习神经网络归一化方法及MATLAB函数

    归一化方法及 MATLAB函数 数据归一化方法是神经网络预测前对数据常做的一种处理方法 数据归一化处理把所有数据都转化为 xff3b 0 xff0c 1 xff3d 之间的数 xff0c 其目的是取消各维数据间数量级差别 xff0c 避免因
  • 2022数模国赛B题无人机第一题第一小问的简单编程

    前言 2022年国赛B题是关于无人机定位的抽象模型 xff0c 总体难度不大 接下来简单介绍一下第一题第一小问的程序实现 xff0c 当时国赛仓促 xff0c 写的比较简略 xff0c 仅供参考 背景介绍 无源定位 第一个关键词是无源定位
  • Linux基础之网络编程

    网络编程篇 一 网络编程概述二 字节序三 socket编程步骤四 socket服务端和客户端代码的初步实现五 简单的ftp项目实现的功能有哪些 xff1f 六 ftp项目服务器和客户端代码实现 一 网络编程概述 1 进程间通信 xff1a
  • F450无人机组装与调试

    文章目录 认识无人机零部件机架图片 电机电调螺旋桨飞控套件 包括飞控 LED信号灯 xff0c GPS模块 xff0c 电源管理模块 遥控器及遥控器接收机电池护桨 确认工具清单组装过程1 组装机架2 组装电机判断电机正反选择螺丝组装电机连接
  • Openstack-mitaka安装部署

    openstack 一台controller xff0c 一台compute 且两台均为双网卡 xff0c ens33为主网卡 xff0c ens36不需要配置IP 主机名称 网卡名称 网卡类型 网卡IP ens33 controllere
  • Vue history模式路由 部署到二级目录 配置

    1 nginx配置 https xxxx com cms gt C static server cms location cms root C static server 项目部署资源所在磁盘目录 index index html try
  • 【Docker】将本地镜像推送到远程库/私有库

    前言 这里记录如何将本地镜像推送到远程库和私有库 区别 xff0c 一个是存放到阿里云 xff0c 同一个团队可以登录到同一个阿里云仓库 xff0c 去拉取镜像 一个是存放到本地私有库 xff0c 同一个团队可以连接同一个私有库 xff0c
  • HTTP协议--几种数据传输方式

    1 xff09 无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议 xff0c 即无状态协议 这种设置的好处是 xff1a 更快的处理更多的请求事务 xff0c 确保协议的可伸缩性 不过随着web的不断发展 xff0c
  • PDU 超链接

    http blog sina com cn s blog 453226290102wvnu html http blog sina com cn s blog 453226290102wvnv html http blog sina com
  • Canal监控MySQL数据到Kafka详细步骤(jdk+zookeeper+kafka+canal+mysql)

    目录 一 前言二 环境准备三 安装JDK四 安装zookeeper五 安装Kafka六 安装MySQL七 安装canal服务端 xff08 canal监控mysql数据发送到kafka xff09 八 测试是否可以监控到数据九 结语 一 前
  • 流媒体服务器搭建

    本文介绍如何在阿里云 腾讯云等云主机上搭建流媒体服务器 xff0c 包括如何选择云主机配置 如何选择带宽和流媒体服务器软件选择等 流媒体服务器是支撑视频播出的基础系统 xff0c 具有视频直播 视频点播的播出能力 xff0c 有些使用场景下
  • 什么是BGP

    文章目录 1 基本概念什么是BGPBGP路由协议的特点IBGP水平分割规则BGP的路由器号 Router ID BGP工作原理BGP分类 1 基本概念 自治系统 xff0c 指的是在同一个组织管理下 使用相同策略的设备的集合 xff1b 不
  • Web服务------Nginx域名重定向(Location匹配与Rewrite重写)

    目录 一 常用的Nginx正则表达式二 location1 location 的分类2 location 常用的匹配规则3 location 优先级4 location 示例说明5 优先级总结6 匹配规则 二 rewrite1 rewrit
  • 华为云-计算云服务介绍

    前言 相信很多小伙伴在刚开始接触各类云产品的时候 xff0c 被各种各样的云产品类如规格 型号 价格 适用场景等问题所困扰 本文就给大家介绍一下华为云常见云产品的规格区别和适用场景 帮助大家选择合适的云产品 文章目录 前言一 计算云服务1
  • 数据资源 | 八大板块!数据公开下载渠道

    本文综合整理自网站企研 中国学术大数据平台 xff08 https r qiyandata com xff09 来源 xff1a 企研 中国学术大数据平台 公共数据资源 目录 三农 地理信息 生态环境 碳中和 调查数据 省级统计局 省级政府
  • [C++] std::vector

    std vector template lt class T class Alloc 61 allocator lt T gt gt class vector generic template vector是表示可以改变大小的数组的序列容器