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

news2024/11/20 10:23:40
定义于头文件 <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>::empty

bool empty() const;

(C++11 前)

bool empty() const noexcept;

(C++11 起)
(C++20 前)

[[nodiscard]] bool empty() const noexcept;

(C++20 起)

 检查容器是否无元素,即是否 begin() == end() 。

参数

(无)

返回值

若容器为空则为 true ,否则为 false

复杂度

常数。

返回容纳的元素数

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

size_type size() const;

(C++11 前)

size_type size() const noexcept;

(C++11 起)

 返回容器中的元素数,即 std::distance(begin(), end()) 。

参数

(无)

返回值

容器中的元素数量。

复杂度

常数。

返回可容纳的最大元素数

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

size_type max_size() const;

(C++11 前)

size_type max_size() const noexcept;

(C++11 起)

 返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。

参数

(无)

返回值

元素数量的最大值。

复杂度

常数。

注意

此值通常反映容器大小上的理论极限,至多为 std::numeric_limits<difference_type>::max() 。运行时,可用 RAM 总量可能会限制容器大小到小于 max_size() 的值

调用示例

#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;
    };

    std::vector<Cell> vector1;
    //检查容器是否无元素,即是否 begin() == end() 。
    std::cout << "vector1   empty: " << vector1.empty() << std::endl;
    //替换容器的内容。1) 以 count 份 value 的副本替换内容。
    vector1.assign(6, generate());
    //检查容器是否无元素,即是否 begin() == end() 。
    std::cout << "vector1   empty: " << vector1.empty() << std::endl;
    std::cout << "vector1:  ";
    std::copy(vector1.begin(), vector1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    std::vector<Cell> vector2;
    for (size_t index = 0; index < 5; index++)
    {
        vector2.push_back(generate());
        std::cout << "vector2 ";
        //返回容器中的元素数,即 std::distance(begin(), end()) 。
        std::cout << "size(): " << vector2.size() << "  ";
        std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));
        std::cout << std::endl;
    }
    std::cout << std::endl;

    //返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。
    std::vector<bool> vector_b;
    std::cout << "vector<bool> max_size:      " << vector_b.max_size() << std::endl;
    std::vector<char> vector_c;
    std::cout << "vector<char> max_size:      " << vector_c.max_size() << std::endl;
    std::vector<int> vector_i;
    std::cout << "vector<int> max_size:       " << vector_i.max_size() << std::endl;
    std::vector<uint8_t> vector_ui8;
    std::cout << "vector<uint8_t> max_size:   " << vector_ui8.max_size() << std::endl;
    std::vector<uint16_t> vector_ui16;
    std::cout << "vector<uint16_t> max_size:  " << vector_ui16.max_size() << std::endl;
    std::vector<uint32_t> vector_ui32;
    std::cout << "vector<uint32_t> max_size:  " << vector_ui32.max_size() << std::endl;
    std::vector<uint64_t> vector_ui64;
    std::cout << "vector<uint64_t> max_size:  " << vector_ui64.max_size() << std::endl;
    std::vector<short> vector_s;
    std::cout << "vector<short> max_size:     " << vector_s.max_size() << std::endl;
    std::vector<double> vector_d;
    std::cout << "vector<double> max_size:    " << vector_d.max_size() << std::endl;
    std::vector<float> vector_f;
    std::cout << "vector<float> max_size:     " << vector_f.max_size() << std::endl;
    std::vector<long> vector_l;
    std::cout << "vector<long> max_size:      " << vector_l.max_size() << std::endl;
    std::vector<long long> vector_ll;
    std::cout << "vector<long long> max_size: " << vector_ll.max_size() << std::endl;
    std::vector<string> vector_str;
    std::cout << "vector<string> max_size:    " << vector_str.max_size() << std::endl;
    std::vector<Cell> vector_Cell;
    std::cout << "vector<Cell> max_size:      " << vector_Cell.max_size() << std::endl;
    return 0;
}

输出

 

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

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

相关文章

I/O常用扩展方法与芯片

主要有四种I/O扩展方法&#xff1a; (1)并行总线扩展的方法 (2)串行口扩展方法 (3)I/O端口模拟串行方法 (4)通过单片机内I/O的扩展方法 IO口扩展可以通过以下芯片来实现&#xff1a; 1、并行扩展芯片&#xff0c;比如8255 &#xff0c;8155等。 2、锁存器或缓冲器来扩展&#x…

README.md编写

一、摘要 项目一般会有个描述文件&#xff0c;对于项目的代码来讲&#xff0c;这个描述就是README.md文件&#xff0c;可以描述各模块功能、目录结构等。该文件可以方便让人快速了解项目的代码结构和功能。当然&#xff0c;若要深层次的了解项目&#xff0c;就得看项目总体的需…

Postman(接口测试工具)使用教程

目录 Postman(接口测试工具) Postman 介绍 Postman 相关资源 Postman 安装 具体安装步骤 ● 安装 Postman 快速入门 快速入门-实现步骤 其它说明 Postman(接口测试工具) Postman 介绍 1. Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 2. 做 WEB 页面开…

(MAX5048BAUT+T)ASEMI代理美信MAX5048BAUT+T车规级芯片

编辑-Z MAX5048BAUTT特征&#xff1a; 型号&#xff1a;MAX5048BAUTT 可控上升和下降时间的独立源和汇输出 4V至12.6V单电源 7.6A/1.3A峰值吸收/源极驱动电流 0.23Ω 开路漏极N沟道吸收输出 2.Ω 漏极开路P通道源极输出 12ns&#xff08;典型&#xff09;传播延迟 反相…

Mybatis方式完成CRUD操作

Mybatis方式完成CRUD操作 文章目录 Mybatis方式完成CRUD操作1、java以Mybatis方式操作DB1.1、配置数据源-创建 resources/mybatis-config.xml1.2、创建java bean-Monster1.3、配置Mapper接口声明方法1.4、配置xxMapper&#xff0c;完成SQL配置,实现CRUD操作1.5、Test测试 2、需…

AI生成天空盒!泰裤辣!

我经常做一些奇奇怪怪的梦&#xff0c;醒来的时候特别想把这些NB的场景给画下来分享给别人。 我尝试过AI绘画&#xff0c;但是还没达到我想要的那种沉浸的效果。如果能通过我的描述生成3D场景就好了。 直到我发现了它&#xff01; 先来欣赏一下它的杰作&#xff1a; 这个工具通…

微信公众号扫码登录(一)—— 获取微信公众号二维码

引言 这几天在研究微信登录&#xff0c;今天解决了获取微信二维码问题&#xff1b;在这里总结一下 关于微信登录想说的话 第一次接触微信登录&#xff0c;开始就弄混了登录方式&#xff1b;简单来说&#xff0c;微信扫码登录分为两种&#xff0c;一种是微信公众平台&#xf…

SAP 从入门到放弃系列之工作中心(workcenter)

目录 概念 数据收集 主要配置点&#xff1a; 工作中心类别 工作中心字段选择 工作中心公式 标准值码 工作中心位置 工序控制码 概念 工作中心是为制造过程增加价值的一台机器或一组机器、一个人或一组人&#xff0c;或一组人和机器。 数据收集 在 实施项目期间&#x…

汉诺塔问题(解出来了带你看洛丽塔)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

[230508]托福听力真题TPO66|词汇总结| 精听|19:30~20:10 20:50~23:00 8:30~9:40

TPO66 L1&#xff1a; 3/6 TPO66 L2&#xff1a; TPO66 L3&#xff1a; 目录 TPO66 C1 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 C2 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 L1 重点词汇 TPO66 L2 重点词汇 TPO66 L3 重点词汇 TPO66 C1 一、要点 …

大家都去荷兰注册公司到底是为了什么?

荷兰位于欧洲大陆西北部&#xff0c;北濒北海&#xff0c;与德国和比利时接壤。国土总面积为41528平方公里&#xff0c; 2020年2月人口达1741万人。荷兰是中国企业海外投资的重要目的地国之一。目前&#xff0c;中国是荷兰至二大外资项目来源国。据荷方统计&#xff0c;目前&am…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01; ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09; GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;…

Java程序设计入门教程--数组

目录 一、一维数组创建 1. 定义数组 &#xff08;1&#xff09;声明 &#xff08;2&#xff09;分配数组内存空间 2. 数组初始化 &#xff08;1&#xff09;静态初始化 &#xff08;2&#xff09;动态初始化 3. 一维数组的拷贝 &#xff08;1&#xff09;数组元素的拷…

家用洗地机哪种好?怎么选购家用洗地机

在这个高度关注环境、健康和安全的时代&#xff0c;洗地机已成为多种设施不可或缺的清洁工具。它不仅可以提高清洁速度和质量&#xff0c;还可以协助您提高生产效率和管理流程。洗地机的优点在于它易于使用&#xff0c;具有多种高效能力和灵活性&#xff0c;是一个为现代清洁服…

(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析

链表面试题 203. 移除链表元素题目解法一&#xff1a;递归解法二&#xff1a;迭代 206. 反转链表题目解法一&#xff1a;递归解法二&#xff1a;迭代 876. 链表的中间结点题目解法一&#xff1a;快慢指针法解法二&#xff1a;单指针法 链表中倒数第k个结点题目解法 21. 合并两个…

22.碳交易机制下考虑需求响应的综合能源系统优化运行

说明书 MATLAB代码&#xff1a;碳交易机制下考虑需求响应的综合能源系统优化运行 注意&#xff1a;另外还有含义柔性负荷、蓄冷式空调、共享储能以及碳捕集的综合能源系统优化运行代码&#xff0c;欢迎咨询 关键词&#xff1a;需求响应 碳交易机制 日前优化调度 综合能源系统…

pdf怎么分割成一页一页的文件?

pdf怎么分割成一页一页的文件&#xff1f;相信很多使用电脑办公的小伙伴们都知道&#xff0c;无论是pdf文件还是ppt文件其都是由很多页组成的。一般当我们需要其中的部分内容时候&#xff0c;可以通过手动的方式将ppt文件来拆分成一页一页的来使用。但是这种手动的方法对于pdf文…

数据库中数据的操作(进阶)

数据库中数据的约束 键值约束 primary key唯一性约束 unique key非空约束 not null默认值 default val扩展属性&#xff08;auto_increment&#xff09;外键约束 foreign keycheck 子句约束 键值约束 primary key 主键约束&#xff1a;primary key 约束指定字段中的值&#xff…

虹科干货 | 零售业数智升级不掉队,get数据,get未来!

电商崛起&#xff0c;传统零售行业危机四伏&#xff0c;全渠道盈利与可持续化成为难点&#xff0c;库存管理这块难啃的“硬骨头”也同样让零售商倍感压力… 背腹受敌的零售商&#xff0c;如何才能在数字化转型道路上避免利润缩水&#xff0c;与供应商协作共赢&#xff0c;摆脱困…

【Mac教学】如何打开macOS 的最大权限

相信有不少用户都知道&#xff0c;目前苹果的Mac 电脑中&#xff0c;有不少功能为了安全问题&#xff0c;设立了多项安全措施&#xff0c;当中有一些需要安装第三方的软件&#xff0c;但因为缺少了苹果认证&#xff0c;而无法使用或安装&#xff0c;因此为各位讲解一个设定&…