c++ 11标准模板(STL) std::vector (三)

news2025/1/11 6:10:51
定义于头文件 <vector>
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template <class T>
    using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

}
(2)(C++17 起)

 

1) std::vector 是封装动态数组的顺序容器。

2) std::pmr::vector 是使用多态分配器的模板别名。

元素相继存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。

(C++03 起)

vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 的调用返回给系统。 (C++11 起)

重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。

vector 上的常见操作复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在末尾插入或移除元素——均摊常数 O(1)
  • 插入或移除元素——与到 vector 结尾的距离成线性 O(n)

std::vector (对于 bool 以外的 T )满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、序列容器 (SequenceContainer) 、连续容器 (ContiguousContainer) (C++17 起)及可逆容器 (ReversibleContainer) 的要求。

成员函数

赋值给容器

std::vector<T,Allocator>::operator=

vector& operator=( const vector& other );

(1)

vector& operator=( vector&& other );

(2)(C++11 起)
(C++17 前)

vector& operator=( vector&& other ) noexcept(/* see below */);

(C++17 起)

vector& operator=( std::initializer_list<T> ilist );

(3)(C++11 起)

 替换容器内容。

1) 复制赋值运算符。以 other 的副本替换内容。若 std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value 为 true ,则以源分配器的副本替换目标分配器。若源分配器与目标分配器不比较相等,则用目标( *this )分配器销毁内存,然后在复制元素前用 other 的分配器分配。 (C++11 起).、

2) 移动赋值运算符。用移动语义以 other 的内容替换内容(即从 other 移动 other 中的数据到此容器)。之后 other 在合法但未指定的状态。若 std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value 为 true ,则用源分配器的副本替换目标分配器。若它为 false 且源与目标分配器不比较相等,则目标不能取走源内存的所有权,而必须单独移动赋值逐个元素,用自己的分配器按需分配额外的内存。任何情况下,原先在 *this 中的元素要么被销毁,要么以逐元素移动赋值替换。

3) 以 initializer_list ilist 所标识者替换内容。

参数

other-用作数据源的另一容器
ilist-用作数据源的 initializer_list

返回值

*this

复杂度

1) 与 *thisother 的大小成线性。

2) 与 *this 的大小成线性,除非分配器不比较相等且不传播,该情况下与 *thisother 的大小成线性。

3) 与 *thisilist 的大小成线性。

异常

2)noexcept 规定:  

noexcept(std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value
|| std::allocator_traits<Allocator>::is_always_equal::value)

(C++17 起)

注意

容器移动赋值(重载 (2) )后,除非不兼容的分配器强制逐元素赋值,否则指向 other 的引用、指针和迭代器(除了尾迭代器)都保持合法,不过指代的元素现在在 *this 中。当前标准通过 §23.2.1[container.requirements.general]/12 中的总括陈述保证这点,而 LWG 2321 下正在考虑更直接的保证。

将值赋给容器

std::vector<T,Allocator>::assign

void assign( size_type count, const T& value );

(1)

template< class InputIt >
void assign( InputIt first, InputIt last );

(2)

void assign( std::initializer_list<T> ilist );

(3)(C++11 起)

替换容器的内容。

1) 以 countvalue 的副本替换内容。

2) 以范围 [first, last) 中元素的副本替换内容。若任一参数是指向 *this 中的迭代器则行为未定义。

InputIt 为整数类型,则此重载与 (1) 拥有相同效果。

(C++11 前)

此重载仅若 InputIt 满足遗留输入迭代器 (LegacyInputIterator) 才参与重载决议。

(C++11 起)

3) 以来自 initializer_list ilist 的元素替换内容。

所有指向容器元素的迭代器、指针及引用均被非法化。尾后迭代器亦被非法化。

参数

count-容器的新大小
value-用以初始化容器元素的值
first, last-复制来源元素的范围
ilist-复制值来源的 initializer_list

复杂度

1) 与 count 成线性

2) 与 firstlast 间的距离成线性

3) 与 ilist.size() 成线性

 

返回相关的分配器

std::vector<T,Allocator>::get_allocator

allocator_type get_allocator() const;

返回与容器关联的分配器。

参数

(无)

返回值

关联的分配器。

复杂度

常数。

 

调用示例

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <vector>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell() = default;
    Cell(int a, int b): x(a), y(b) {}

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator +(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator *(const Cell &cell)
    {
        x *= cell.x;
        y *= cell.y;
        return *this;
    }

    Cell &operator ++()
    {
        x += 1;
        y += 1;
        return *this;
    }


    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }

    bool operator >(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y > cell.y;
        }
        else
        {
            return x > cell.x;
        }
    }

    bool operator ==(const Cell &cell) const
    {
        return x == cell.x && y == cell.y;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}


int main()
{
    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));

    auto generate = []()
    {
        int n = std::rand() % 10 + 110;
        Cell cell{n, n};
        return cell;
    };


    //3) 构造拥有 count 个有值 value 的元素的容器。
    std::vector<Cell> vector1(6, generate());
    std::generate(vector1.begin(), vector1.end(), generate);
    std::cout << "vector1:  ";
    std::copy(vector1.begin(), vector1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;


    //替换容器内容。1) 复制赋值运算符。以 other 的副本替换内容。
    std::vector<Cell> vector2 = vector1;
    std::cout << "vector2:  ";
    std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    //2) 移动赋值运算符。用移动语义以 other 的内容替换内容(即从 other 移动 other 中的数据到此容器)。
    //之后 other 在合法但未指定的状态。
    std::vector<Cell> vector3 = std::move(vector1);
    std::cout << "vector3:  ";
    std::copy(vector3.begin(), vector3.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << "vector1   empty: " << vector1.empty() << std::endl;

    //3) 以 initializer_list ilist 所标识者替换内容。
    std::vector<Cell> vector4 =
    {{101, 101}, {102, 102}, {103, 103}, {104, 104}, {105, 105}, {106, 106}};
    std::cout << "vector4:  ";
    std::copy(vector4.begin(), vector4.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;


    //替换容器的内容。1) 以 count 份 value 的副本替换内容。
    std::vector<Cell> vector5;
    vector5.assign(6, generate());
    std::cout << "vector5:  ";
    std::copy(vector5.begin(), vector5.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    //2) 以范围 [first, last) 中元素的副本替换内容。若任一参数是指向 *this 中的迭代器则行为未定义。
    std::vector<Cell> vector6;
    vector6.assign(vector5.begin(), vector5.end());
    std::cout << "vector6:  ";
    std::copy(vector6.begin(), vector6.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    //3) 以来自 initializer_list ilist 的元素替换内容。
    std::vector<Cell> vector7;
    vector7.assign({{101, 101}, {102, 102}, {103, 103}, {104, 104}, {105, 105}, {106, 106}});
    std::cout << "vector7:  ";
    std::copy(vector7.begin(), vector7.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Winform从入门到精通(36)——ColorDialog(史上最全)

文章目录 前言一、属性1、AllowFullOpen2、AnyColor3、Color4、FullOpen5、ShowHelp6、SolidColorOnly7、Tag二、事件1、HelpRequest前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen…

LoadRunner 安装指南:详解安装步骤和常见问题解决方法

目录&#xff1a;导读 引言 LoadRunner安装 LoadRunner的安装 结语 引言 作为一款领先的性能测试工具&#xff0c;LoadRunner 被广泛应用于各种企业级应用程序和系统的性能测试中。然而&#xff0c;对于初学者来说&#xff0c;正确安装 LoadRunner 并不是一件容易的事情。…

Spring 填充属性和初始化流程源码剖析及扩展实现

前言 在上一篇博文 讲解 Spring 实例化的不同方式及相关生命周期源码剖析 介绍了 Spring 实例化的不同方式&#xff0c;本文主要围绕实例化过后对象的填充属性和初始化过程进行详细流程剖析 回顾前言知识&#xff0c;doCreateBean->createBeanInstance&#xff0c;通过 S…

沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟

目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 CH32V 存储容量命名方式 在介绍下面的内容前, 先看一下CH32V系列和存储相关的命名格式, 以CH32V203为例, 前面的CH32V203代表一个系列, 后面的字…

剑指offer(C++)-JZ47:礼物的最大价值(算法-动态规划)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 在一个m\times nmn的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于…

使用CometD技术实现web系统中的主动推送

CometD技术通过Http长轮询(或websocket长链接)方式在服务器与客户端之间构建了一条交互的链路。它们都遵守Bayeux协议,交换的消息是Bayeux message,消息格式是JSON。 1、需求说明 当用户登录后,后台根据用户订阅把最新的信息反推给web客户端,展示在页面上。CometD服务器…

菜地管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87737285 更多系统资源库地…

计算机组成原理9控制单元的结构

9.1操作命令的分析 取值周期间址周期执行周期中断周期 取指周期数据流 PC存放下条指令的地址给MAR访问存储器相应单元&#xff0c;将数据取出来送给MDR寄存器&#xff0c;MDR取出来的内容送给IR指令寄存器&#xff0c;然后对指令进行译码&#xff0c;把指令的操作码部分取出…

医学图像的深度学习的完整代码示例:使用Pytorch对MRI脑扫描的图像进行分割

图像分割是医学图像分析中最重要的任务之一&#xff0c;在许多临床应用中往往是第一步也是最关键的一步。在脑MRI分析中&#xff0c;图像分割通常用于测量和可视化解剖结构&#xff0c;分析大脑变化&#xff0c;描绘病理区域以及手术计划和图像引导干预&#xff0c;分割是大多数…

MySQL解析器和优化器,你了解它们吗?

解析器都做哪些事情 其主要功能是将输入的SQL语句分解为语法单元&#xff0c;然后将这些语法单元转换为内部表示的数据结构&#xff0c;最终生成一个可执行的查询计划。解析器是MySQL中的一个重要组成部分&#xff0c;它直接影响查询的性能和正确性。 词法分析&#xff1a; …

【win11的CARSIM2020安装教程最全,包括下载地址,关闭防火墙】

carsim2020.0软件下载地址参考&#xff1a;https://www.cnblogs.com/bbman/p/15148890.html 百度网盘提取后&#xff0c;先关闭防护墙。 如何永久关闭windows defender杀毒软件。 第一种方式 安装某一杀毒软件&#xff0c;比如某管家、某60&#xff0c;杀毒软件会覆盖Defender…

PC或服务器装双系统

1. 准备工作 1.1U盘启动盘的制作 ①准备一个 4G 以上的 U 盘&#xff0c;备份好U盘资料&#xff0c;后面会对 U 盘进行格式化。 ②去CentOS官网下载你想要安装的 ISO 格式镜像文件&#xff0c;现在通常是CentOS6、7或者8。如果你英文不太好&#xff0c;可以选择使用edge浏览…

【Python入门】NumPy数组副本 vs 视图 / 数组形状 / 数组重塑

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 副本和视图之间的区别 副本和数组视图之间的主要区别在于副本是一个新数组&#xff0c;而这个视图只是原始数组的视图。 副本拥有数据&#xff0c;对副本所做的任何更改都不会影响原始数组&#xff0c;对原始数组所做的任…

《花雕学AI》27:如何在ChatGPT时代提高数字媒体艺术的原创性和价值?

引言 数字媒体艺术是指使用各种数字、信息技术制作的各种形式的有独立审美价值的艺术作品&#xff0c;具有模拟现实的虚拟性、艺术创造的想象性、交互性和使用网络媒体的基本特征。数字媒体艺术是一个跨自然科学、社会科学和人文科学的综合性学科&#xff0c;集中体现了“科学…

vue3+element-plus角色权限管理分配

这里的图片是截图这个老师的项目 为了方便大家使用,我会在每个图片下面将代码原封不动打一遍 在src/uitls/permission.js加入以下内容 本段代码讲解: 参数一:后台传来的路由 参数二:前端所有的路由 先遍历前端所有路由,在里面继续遍历后台路由,通过二者某一个关键字的是否相同…

入门大纲 我为什么使用delta-io 数据湖 替代hive

1 大厂背书 databricks宣布把delta-io共享给apache基金会 并且delta-io从以前打杂的0.x版本升级为1.x 随后就是bug的各种修复和新功能的增加. release note可以看: Releases delta-io/delta GitHub 2 并发控制(解决了多任务并发读写表时的 读写冲突) hive/spark 如果多个任…

Android DownloadManager 下载安装App功能实现

@[DownlaodManager 实战] 升级功能是APP必备功能,本文以下载安装APP的完整流程来说明DownlaodManager的基本使用方法。 前提准备 下载需要互联网权限,需要申请<uses-permission android:name="android.permission.INTERNET" />权限; 安装APP,需要申请<…

【微机原理】8088/8086CPU引脚

8086是16位微处理器数据线有16根&#xff1b;8088是准16位微处理器&#xff0c;它对外的数据线是8位的。他们的地址线都是20位的&#xff0c;8088/8086均为40条引线、双列直插式封装 地址线决定了访问主存的容量&#xff0c;数据线决定了CPU的运输能力 为了能在有限的40条引线范…

【C语言】十大经典排序代码及GIF演示

&#x1f525;&#x1f525;&#x1f525;专栏推荐&#xff1a;C语言基础语法&#x1f525;&#x1f525;&#x1f525; 十大经典排序代码 1. 冒泡排序2. 选择排序3. 插入排序4. 快速排序5. 归并排序6. 堆排序7. 希尔排序8. 计数排序9. 桶排序10. 基数排序 1. 冒泡排序 通过依次…

MQ 服务占用 CPU 太高

文章目录 MQ 服务占用 CPU 太高1. 出现问题2. 分析过程1. 通过日志定位问题服务2. 查询异常服务进程、CPU、内存、IO、锁和网络3. CPU 占用过高分析 3. 解决方案 MQ 服务占用 CPU 太高 1. 出现问题 测试环境中&#xff0c;匹配业务运行时会出现响应缓慢或超时失败的情况 2. …