首页 > 其他分享 >让自定义的容器,也能基于范围循环

让自定义的容器,也能基于范围循环

时间:2023-11-07 21:45:48浏览次数:33  
标签:std 容器 arr vector return 自定义 Tp 循环 size

  C++11起,引入了基于范围的for循环这一特性,有什么好处呢?它有时可以大大地简化遍历容器的操作,比如说STL的vector。

std::vector v{1, 2, 3};
std::vector<int>::iterator it = begin(v);

for (; it != end(v); ++it)
    std::cout << *it << '\n';

  这是使用了迭代器的写法,这时候我们的C++11的for循环就可以大展身手了。

std::vector v{1, 2, 3};

for (const auto& item : v)
    std::cout << item << '\n';

  当然,除了STL,数组的遍历也是没问题的。接下来到了本篇的主线,假如说我定义了一个数据结构,如下:

template <typename _Tp, std::size_t N>
struct Container {
    using value_type = _Tp;

    _Tp arr[N];

    std::size_t size() {
        return N;
    }

    Container() {
        for (std::size_t i{}; i < N; ++i) 
            arr[i] = i;
    }
};

   这时候当我们也想使用之前的操作的时候,我们会发现

  信息有点多,不过很容易就注意到了两个关键点,分别是begin和end,我们可以为其提供一个接口看看。

template <typename _Tp, std::size_t N>
struct Container {
    using value_type = _Tp;

    _Tp arr[N + 1];

    std::size_t size() {
        return N;
    }

    Container() {
        for (std::size_t i{}; i < N; ++i) 
            arr[i] = i;
    }

    constexpr _Tp *begin() noexcept {
        return &arr[0];
    }

    constexpr _Tp *end() noexcept {
        return &arr[N];
    }
};

  因为STL的end指针是指向最后一个元素的下一位,所以我们数组额外开多一个空间,经过此次修改,就能成功运行了。

标签:std,容器,arr,vector,return,自定义,Tp,循环,size
From: https://www.cnblogs.com/ChebyshevTST/p/17816106.html

相关文章

  • docker 更新容器镜像
    本文主要记录使用docker-compose的情况下,来更新镜像、以postgres镜像为例✨只会更新image:postgres:latest,末尾为latest标签的容器镜像进入docker-compose目录按顺序执行以下shell命令#更新容器镜像sudodockercomposepull#启动容器docker-composeup-d--re......
  • 通过计算巢轻松部署ROS自定义资源
    概述阿里云资源编排服务ROS(ResourceOrchestrationService)可以帮助您简化云计算资源的管理。遵循ROS定义的模板规范,您可以定义所需云计算资源的集合及资源间的依赖关系。ROS可以自动完成所有资源的创建和配置,实现自动化部署和运维。ROS不仅能够编排阿里云资源,还支持自定义资源......
  • docker 创建容器 设置端口映射 目录映射
    dockerrun-d-p8042:8080-v$PWD:/usr/local/tomcat/webapps--namemyProjectNametomcat:8-jdk8-d后台运行-p端口映射将容器的8080端口映射到主机的8042端口-v目录映射$PWD:指定宿主机当前目录挂载到容器的webapps--name指定容器名称为myProjectName tomcat:8-jdk8......
  • 循环:switch
    1.switch循环 switch(Type){case1:if(answerCount>1){isCorrect=false;remark+="单选题只能有一个答案;";......
  • byte[]、list<byte>数组类型的几个自定义扩展方法
    byte[]、list<byte>数组类型的几个自定义扩展方法。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceiPublic.类型扩展方法{///<summary>///类型的扩展方法,用起来方便的///修改记录:///20230415,海......
  • python初学者学习笔记-第四章-条件和循环
    chapter4/条件和循环4.1条件4.1.1基本形式条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的子程序;每个条件后面要使用冒号”:”,表示满足条件后执行子程序。缩进来划分子程序范围,相同缩进的语句组成一个整体子程序。如果“condition”为True,将执行"sub_p......
  • vue:通过数组循环创建表格,表格中有输入框需校验,最后需要一次性校验所有表格。
    表格内有form表单,form表单绑定的model数据类型必须为对象。所以需要先处理一下接口请求回来的数据。 表单需要校验,校验要用到ref,所以通过索引给每个表单生成自己专属的ref。 统一写一个校验规则,绑定至form表单中的rules中,随后在表格内的输入框form-item中绑定对应的规定。......
  • (九)C#编程基础复习——while循环
    在C#中,while循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用while循环而不是for循环。其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。示例代码如下:inti=1;while(i<9){Console.Write("{0}",......
  • Qt事件循环及QEventLoop的使用
    目录一、介绍二、QCoreApplication主事件循环三、事件循环的开启例一例二四、父子事件传递五、processEvents六、QEventLoop类七、事件循环的嵌套及QEventLoop模拟同步调用1、同步获取数据2、主线程等待3、对话框弹出一、介绍Qt作为一个跨平台的UI框架,其事件循环实现原理......
  • bitsdojo_window自定义导航以及关闭按钮
    1、Windows里面的配置在应用程序文件夹中,转到windows\runner\main.cpp,并在文件开头添加以下两行:#include<bitsdojo_window_windows/bitsdojo_window_plugin.h>autobdw=bitsdojo_window_configure(BDW_CUSTOM_FRAME|BDW_HIDE_ON_STARTUP);2、macOS里面的配置1、在应用程......