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

news2024/10/3 0:24:56
定义于头文件 <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>::at

reference       at( size_type pos );

const_reference at( size_type pos ) const;

 返回位于指定位置 pos 的元素的引用,有边界检查。

pos 不在容器范围内,则抛出 std::out_of_range 类型的异常。

参数

pos-要返回的元素的位置

返回值

到所需元素的引用。

异常

若 !(pos < size()) 则抛出 std::out_of_range

复杂度

常数。

访问指定的元素

std::vector<T,Allocator>::operator[]

reference       operator[]( size_type pos );

const_reference operator[]( size_type pos ) const;

 返回位于指定位置 pos 的元素的引用。不进行边界检查。

参数

pos-要返回的元素的位置

返回值

到所需元素的引用。

复杂度

常数。

注意

不同于 std::map::operator[] ,此运算符决不插入新元素到容器。

访问第一个元素

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

reference front();

const_reference front() const;

 返回到容器首元素的引用。

在空容器上对 front 的调用是未定义的。

参数

(无)

返回值

到首元素的引用

复杂度

常数

注意

对于容器 c ,表达式 c.front() 等价于 *c.begin() 。

访问最后一个元素

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

reference back();

const_reference back() const;

 返回到容器中最后一个元素的引用。

在空容器上对 back 的调用是未定义的。

参数

(无)

返回值

到最后元素的引用。

复杂度

常数。

注意

对于容器 c ,表达式 return c.back(); 等价于 { auto tmp = c.end(); --tmp; return *tmp; }

返回指向内存中数组第一个元素的指针

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

T* data() noexcept;

(C++11 起)

const T* data() const noexcept;

(C++11 起)

 返回指向作为元素存储工作的底层数组的指针。指针满足范围 [data(); data() + size()) 始终是合法范围,即使容器为空(该情况下 data() 不可解引用)。

参数

(无)

返回值

指向底层元素存储的指针。对于非空容器,返回的指针与首元素地址比较相等。

复杂度

常数。

注意

若 size() 为 0 ,则 data() 可能或可能不返回空指针。

调用示例

#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;
    std::cout << std::endl;

    for (size_t index = 0 ; index < vector1.size(); index++)
    {
        Cell cell = generate();
        //返回位于指定位置 pos 的元素的引用,有边界检查。
        //若 pos 不在容器范围内,则抛出 std::out_of_range 类型的异常。
        //reference       at( size_type pos );
        vector1.at(index) = cell;
        std::cout << "vector1.at( " << index << " ) = " << cell << std::endl;
    }
    std::cout << std::endl;

    for (size_t index = 0 ; index < vector1.size(); index++)
    {
        //返回位于指定位置 pos 的元素的引用,有边界检查。
        //若 pos 不在容器范围内,则抛出 std::out_of_range 类型的异常。
        //const_reference at( size_type pos ) const;
        std::cout << "vector1.at( " << index << " ) = "
                  << vector1.at(index) << std::endl;
    }
    std::cout << std::endl;

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


    for (size_t index = 0 ; index < vector2.size(); index++)
    {
        Cell cell = generate();
        //返回位于指定位置 pos 的元素的引用。不进行边界检查。
        //reference       operator[]( size_type pos );
        vector2[index] = cell;
        std::cout << "vector2[] " << index << " ] = " << cell << std::endl;
    }
    std::cout << std::endl;

    for (size_t index = 0 ; index < vector2.size(); index++)
    {
        //返回位于指定位置 pos 的元素的引用。不进行边界检查。
        //const_reference operator[]( size_type pos ) const;
        std::cout << "vector2[ " << index << " ] = "
                  << vector2[index] << std::endl;
    }
    std::cout << std::endl;

    //返回到容器首元素的引用。在空容器上对 front 的调用是未定义的。
    Cell cell = generate();
    vector1.front() = cell;
    std::cout << "vector1.front() = " << cell << std::endl;
    std::cout << "vector1.front() : " << vector1.front() << std::endl;
    std::cout << std::endl;

    //返回到容器中最后一个元素的引用。在空容器上对 back 的调用是未定义的。
    vector1.back() = cell;
    std::cout << "vector1.back()  = " << cell << std::endl;
    std::cout << "vector1.back()  : " << vector1.back() << std::endl;
    std::cout << std::endl;

    for (size_t index = 0; index < vector1.size(); index++)
    {
        //返回指向作为元素存储工作的底层数组的指针。
        //指针满足范围 [data(); data() + size()) 始终是合法范围,
        //即使容器为空(该情况下 data() 不可解引用)。
        //T* data() noexcept;
        Cell cell = generate();
        *(vector1.data() + index) = cell;
        std::cout << "vector1: " << (vector1.data() + index)
                  << " = " << cell << std::endl;
    }
    std::cout << std::endl;

    for (size_t index = 0; index < vector1.size(); index++)
    {
        //返回指向作为元素存储工作的底层数组的指针。
        //指针满足范围 [data(); data() + size()) 始终是合法范围,
        //即使容器为空(该情况下 data() 不可解引用)。
        //const T* data() const noexcept;
        std::cout << "vector1: " << (vector1.data() + index) << " : "
                  << *(vector1.data() + index) << std::endl;
    }

    return 0;
}

输出

 

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

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

相关文章

庖丁解牛函数知识---C语言《1》

目录 前言&#xff1a; 1.程序中的函数 2.库函数的学习和使用 3.自定义函数 4.传值调用与传址调用 5.形参与实参 6.练习---二分查找函数 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&#xff0c;C生…

Apache POI,springboot中导出excel报表

2. Apache POI 2.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 Apache POI 的应用场景…

【SQL】窗口函数及行转列等操作总结

1. 窗口函数 窗口函数的应用 排名问题&#xff1a;每个部门按业绩来排名 topN问题&#xff1a;找出每个部门排名前N的员工进行奖励 窗口函数的语法 <窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>) <窗口函数>的位置&…

Java基础--->JVM(1)

文章目录 为什么学习JVM&#xff1f;什么是虚拟机&#xff1f;JVM的作用JVM组成部分类加载器类什么时候会被加载&#xff08;初始化&#xff09;有哪些类加载器什么是双亲委派机制如何打破双亲委派机制 为什么学习JVM&#xff1f; ​ 学习JVM是为了能更深入的理解Java这门语言&…

推荐算法实战项目:PNN 原理以及案例实战(附完整 Python 代码)

本文要介绍的是由上海交通大学的研究人员提出的PNN&#xff08;Product-based Neural Networks&#xff09;模型&#xff0c;该模型包含一个embedding层来学习类别数据的分布式表示&#xff0c;此外还包含product层来捕获字段之间的特征交互模式&#xff0c;最后包含一个全连接…

一个实例讲讲 ChatGPT 推理

吴恩达与 OpenAI 官方联合推出了 1.5 小时的免费视频课&#xff1a;地址&#xff1a; https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/2/guidelines 今天我学了第四讲&#xff0c;ChatGPT Inferring&#xff0c;即推理 教学中&#xff0c;给的例子是情绪判断。 我很…

手写数字识别基本思路

问题 什么是MNIST?如何使用Pytorch实现手写数字识别&#xff1f;如何进行手写数字对模型进行检验&#xff1f; 方法 mnist数据集 MNIST数据集是美国国家标准与技术研究院收集整理的大型手写数字数据集&#xff0c;包含了60,000个样本的训练集以及10,000个样本的测试集。 使用P…

RIP笔记

目录 RIP路由信息协议——UDP520端口(RIPNG521端口) RIP使用的算法——贝尔曼福特算法 RIP的版本 RIP的数据包 RIP的工作过程 RIP的计时器 周期更新计时器——默认30s 失效计时器——默认180s 垃圾回收计时器——默认120s RIP的环路问题 解决方法&#xff1a; RIP的…

12种接口优化的通用方案

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库…

Item冷启优化

Item冷启动的目标&#xff1a; 1.精准推荐。 2.激励发布。 3.挖掘高潜。 Item冷启动优化措施&#xff1a; 1.优化全链路&#xff08;召回和排序&#xff09; 2.流量调控&#xff08;新老物品的流量分配&#xff09; 评价指标&#xff1a; 作者侧&#xff1a; 发布渗透率&a…

【基于Ubuntu18.04+Melodic的realsense D435安装】

【基于Ubuntu18.04Melodic的realsense D435安装】 1. RealSense SDK安装1.1 克隆SDK1. 2 安装相关依赖1.3 安装权限脚本1. 4 进行编译与安装1.5 测试安装是否成功 2. D435i 安装ROS接口2.1 方法一realsense—ros源码2.2 方法二安装相机库 3. 总结 1. RealSense SDK安装 系统硬…

C++:分治算法之选择问题的选择第k小元素问题

目录 3.2.6 选择问题 分析过程&#xff1a; 解法一&#xff1a; 算法代码&#xff1a; 【单组数据】 【多组数据】 运行结果&#xff1a; 解法二 代码&#xff1a; 运行结果&#xff1a; 解法三&#xff1a; 3.2.6 选择问题 ¢ 对于给定的 n 个元素的数组 a[0 …

DAY 53 Haproxy负载均衡集群

常见的Web集群调度器 目前常见的Web集群调度器分为软件和硬件&#xff1a; 软件通常使用开源的LVS、Haproxy、 Nginx LVS性能最好&#xff0c;但是搭建相对复杂&#xff1b;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;高并发性能…

第一章 Linux是什么

Linux是一套操作系统&#xff0c;如同下图所示&#xff0c;Linux就是核心与系统调用接口那两层。至于应用程序不算Linux。 1.1 Linux当前应用的角色 由于Linux kernel实在是非常的小巧精致&#xff0c;可以在很多强调省电以及较低硬件资源的环境下面执行&#xff1b; 此外&…

【Elasticsearch】NLP简单应用

文章目录 NLP简介ES中的自然语言处理(NLP)NLP演示将opennlp插件放在ESplugins路径中下载NER模型配置opennlp重启ES、验证 NLP简介 NLP代表自然语言处理&#xff0c;是计算机科学和人工智能领域的一个分支。它涉及使用计算机来处理、分析和生成自然语言&#xff0c;例如英语、中…

企业对网络安全的重视度开始降低

近日&#xff0c;英国科学技术部发布了《2023年企业网络安全合规调查报告》&#xff08; Cyber Security Breaches Survey &#xff09;&#xff0c;对英国所有企业和社会性组织目前的网络威胁态势和合规建设进行研究&#xff0c;同时也就如何提升新一代网络应用的合规性给出专…

02-管理员登录与维护 尚筹网

一、管理员登陆 需要做的&#xff1a; 对存入数据库的密码进行MD5加密在登录界面登录失败时的处理抽取后台页面的公共部分检查登录状态&#xff0c;防止未登录时访问受保护资源的情况 具体操作如下&#xff1a; 1&#xff09;、MD5加密 ​ 使用到的CrowdConstant类中的一些…

人的全面发展评价指标体系—基于相关-主成分分析构建

本文先从经济、社会、生活质量和人口素质四个方面海选了众多人的全面发展评价指标&#xff0c;然后根据可观测性原则剔除无法获得的指标进行了初步筛选&#xff0c;再利用相关性分析删除相关系数大的指标&#xff0c;以及通过主成分分析删除因子负载小的指标&#xff0c;完成了…

CCD视觉检测设备如何选择光源

CCD视觉检测设备的机器视觉系统对光源的要求很高&#xff0c;光源是决定图像质量的一个重要因素。那么&#xff0c;我们就来看看CCD图像加网设备和机器视觉系统光源的选择点——CCD图像加网设备。 CCD视觉检测设备机器视觉系统光源选择要点&#xff1a; 1. 对比度&#xff1a;…

最新VUE面试题

前言 本文以前端面试官的角度出发&#xff0c;对 Vue 框架中一些重要的特性、框架的原理以问题的形式进行整理汇总&#xff0c;意在帮助作者及读者自测下 Vue 掌握的程度。 本文章节结构以从易到难进行组织&#xff0c;建议读者按章节顺序进行阅读&#xff0c;当然大佬级别的…