C++ -- 学习系列 std::array 容器

news2024/11/28 2:30:44

1. std::array 是什么?

      array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。

与数组一样,其底层存储空间是连续的。

array 和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。

2. 使用方法

2.1. array 的模板参数:

    1.1   T 代表 array 中元素的类型

    1.2   N 代表 array 中元素的个数

namespace std{
    template <typename T, size_t N>
    class array;
}

2.1  使用例子:

   

// main.cpp
#include<array>
#include<string>
#include<iostream>
#include<memory>


template<typename T, size_t N>
void printArray(std::array<T, N>& arr)
{
//    for(int i=0; i<arr.size(); i++)
//    {
//        std::cout << arr[i] << " ";
//    }
    for(auto it = arr.begin(); it != arr.end(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}


void  testArray()
{
    // 两种初始化
    // 1. 列表初始化
    std::array<int, 6> arr1 = {1, 2, 3, 4, 5};

    // 2. 每个元素初始化
    std::array<int, 6> arr2;
    for(int i=0; i<5; i++)
    {
        arr2[i] = i+1;
    }

    std::cout << "print arr1 ---" << std::endl;
    printArray<int, 6>(arr1);

    std::cout << "print arr2 ---" << std::endl;
    printArray<int, 6>(arr2);
    
    std::array<int, 6> arr2(arr1);
}

int main()
{
  
    testArray();

    return 0;
}

3. 简单实现

     

// may_array.h

#include<initializer_list>
#include<iostream>

template<typename _Tp, int N>
class my_array
{
public:
    my_array();
    my_array(std::initializer_list<_Tp> valList);
    ~my_array();

    _Tp& operator[](int index)
    {
        return *(this->data + index);
    }

    _Tp& at(int index)
    {
        return this->operator[](index);
    }

    _Tp& front()
    {
        return *this->data;
    }

    _Tp& back()
    {
        return *(this->data + N - 1);
    }

    _Tp* begin()
    {
        return this->data;
    }

    _Tp* end()
    {
        return this->data + N;
    }

    const _Tp* const_begin()
    {
        return this->data;
    }

    const _Tp* const_end()
    {
        return this->data + N;
    }

private:
    _Tp *data;
    _Tp* iterator;
    const _Tp* const_iterator;

};

template<typename _Tp, int N>
my_array<_Tp, N>::my_array()
{
    this->data = new _Tp[N];
}

template<typename _Tp, int N>
my_array<_Tp, N>::~my_array()
{
    delete data;
}

template<typename _Tp, int N>
my_array<_Tp, N>::my_array(std::initializer_list<_Tp> valList)
{
    if(valList.size() != N){
        std::cout << "error arguments size not equals to "<< N << std::endl;
        return;
    }
    this->data = new _Tp[N];

    int i = 0;
    for(auto iter = valList.begin(); iter != valList.end(); iter++)
    {
        *(this->data + (i++)) = *iter;
    }
}



// main.cpp
#include<iostream>
#include<string>
#include"my_array.h"

template <typename V, int N>
void print(my_array<V, N>& arr)
{
    for(int i=0; i<N; i++)
    {
        std::cout << arr[i] << std::endl;
    }
}

int main(int argc, char *argv[])
{
    my_array<int, 6> arr1;
    for(int i = 0; i < 6; i++)
    {
        arr1[i] = i + 1;
    }

   for(auto iter = arr1.begin(); iter != arr1.end(); iter++)
   {
       std::cout << *iter << " ";
   }
   std::cout << "-------" <<std::endl;

   for(auto iter = arr1.const_begin(); iter != arr1.const_end(); iter++)
   {
       std::cout << *iter << " ";
   }
   std::cout << "-------" <<std::endl;


   my_array<std::string, 3> arr2 = {"aa", "bb", "cc"};
   for(auto iter = arr2.begin(); iter != arr2.end(); iter++)
   {
       std::cout << *iter << " ";
   }
   std::cout << "-------" <<std::endl;

   for(auto iter = arr2.const_begin(); iter != arr2.const_end(); iter++)
   {
       std::cout << *iter << " ";
   }
   std::cout << "-------" <<std::endl;

   return 0;
}

  

参考文档:array 类(C++ 标准库) | Microsoft LearnC++ array(STL array)容器用法详解 (biancheng.net)

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

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

相关文章

OmniPlan Pro 4 for Mac:引领项目管理的创新与高效

OmniPlan Pro 4是一款强大且高效的项目管理工具&#xff0c;专为Mac用户设计。它提供了一套综合性的解决方案&#xff0c;帮助用户在Mac上便捷地进行项目规划、追踪和管理。凭借其直观的界面&#xff0c;用户可以快速上手&#xff0c;并且能充分利用这款工具的各种功能。 规划…

企业如何获得用户信赖感,媒介盒子告诉你

互联网和新媒体的快速发展使得内容市场空前繁荣&#xff0c;营销方式也越来越多元化&#xff0c;消费者已经很难被夸张吸睛的营销模式打动&#xff0c;他们更倾向于选择自己信赖的产品&#xff0c;对于企业而言&#xff0c;用户信任是决定企业发展与否的关键因素&#xff0c;产…

自动直播软件开发方案:打造智能化、高效化的直播体验

一、引言 随着社交媒体和互联网的快速发展&#xff0c;直播已经成为了人们互动和传播的重要方式。然而&#xff0c;传统直播存在着人力成本高、内容质量不稳定等问题&#xff0c;因此&#xff0c;开发一款自动直软件成为了解决这些问题的关键。 二、市场需求分析 1…

APP稳定性测试工具:Monkey

一、Monkey 简介 Monkey 是一款 app 的自动化测试工具&#xff0c;monkey 是猴子的意思&#xff0c;所以从原理上说&#xff0c;它的自动化测试就类似猴子一样在软件上乱敲按键&#xff0c;猴子什么都不懂&#xff0c;就爱捣乱。Monkey 原理也是类似&#xff0c;通过向系统发送…

JsonUtils

1、工具类 package com.atguigu.utils;import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.Deserialization…

解决hadoop使用put上传报错问题

hadoop使用put上传报错 WARN hdfs.DataStreamer: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /input/yxqzdata.COPYING could only be replicated to 0 nodes instead of minReplication (1). There are 0 datanode(s) runnin…

MySQL搭建主从复制集群,实现读写分离

目录 一、准备 二、配置 2.1 配置主库 修改配置文件/etc/my.cnf 重启服务 为主库再创建一个账户并授权 查看状态 2.2 配置从库 修改配置文件/etc/my.cnf 重启mysql服务 配置需要同步的主机 启动salve同步 查看是否同步 三、测试主从复制是否生效 四、读写分离案…

【计算机毕业设计】基于SpringBoot+Vue热门网游推荐网站的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

C++之va_start、vasprintf、va_end应用总结(二百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

腾讯mini项目-【指标监控服务重构】2023-07-29

今日已办 根据导师代码评审的 comment 改进 修改命名 otelclient.otelExporterOtlpEndpoint to otelclient.endpoint禁用 TLS 加密&#xff0c;移除 otelclient.insecureMode避免命名缩写影响代码的阅读理解把两个函数&#xff08;createTraceExp和createTraceProvider&#…

Softing物联网(IoT)方案之OT/IT数据集成

一 利用数据提高效率和绩效 多年以来数据集成和工业物联网一直在推动着市场的发展&#xff0c;目前我们已经能够集成并成功使用先进的技术、大量的传感器和复杂的数据格式等。而在工业物联网或工业4.0中&#xff0c;还有运营技术&#xff08;OT&#xff09;和信息技术&#xf…

会C++还需要再去学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域&#xff0c;对于软件开发和计算机工程师来说&#xff0c;它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明 以下流程摘抄自官网 在本例中为授权代码流程。 授权码流程的步骤如下&#xff1a; 客户端通过重定向到授权端点来发起 OAuth2 请求。 对于公共客户端&#xff0c;此步骤包括生成code_verifier 并计算code_challenge&#xff0c;然后…

实验5 跨交换机实现VLAN

交换机端口隔离&#xff08;access模式&#xff09; 实验目的实验拓扑实验步骤&#xff08;1&#xff09;在未划分vlan前&#xff0c;配置pc1、pc2、pc3、pc4的地址&#xff0c;如图所示&#xff08;2&#xff09;测试两台pc机的连通性&#xff08;3&#xff09;在S1中创建vlan…

必看!S3File Sink Connector 使用文档

S3File 是一个用于管理 Amazon S3&#xff08;Simple Storage Service&#xff09;的 Python 模块。当前&#xff0c;Apache SeaTunnel 已经支持 S3File Sink Connector&#xff0c;为了更好地使用这个 Connector&#xff0c;有必要看一下这篇使用文档指南。 描述 将数据输出…

springboot druid多数据源配置,及druid监控

基础配置&#xff1a; springboot2.x版本 jdk1.8 依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version> </dependency> &…

分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

我们将从以下3方面讨论Linux网络API&#xff1a; 1.socket地址API。socket最开始的含义是一个IP地址和端口对&#xff08;ip&#xff0c;port&#xff09;&#xff0c;它唯一表示了使用TCP通信的一端&#xff0c;本书称其为socket地址。 2.socket基础API。socket的主要API都定…

打开泰坦陨落提示msvcp120.dll丢失怎么办?三个解决方法快速解决

首先&#xff0c;我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2013 Redistributable中的一个组件。这个文件对于一些软件的运行是非常重要的&#xff0c;如果缺失或损坏&#xff0c;就会导致软件无法正常运行。…

从淘宝数据分析产品需求(商品销量总销量精准月销)

淘宝数据分析总体来说可以分为商品分析、客户分析、地区分析、时间分析四大维度(参考数据雷达的分析思路)。在这里我重点说商品分析。 在淘宝上开店的竞争还是非常激烈的&#xff0c;随便拿出一个单品就有很多竞品存在&#xff0c;所以做起来还是很难的&#xff0c;而想要在众…