cpp 自定义类实现for (:)遍历

C++范围for循环:从语法原理到实战应用全解析 在C++编程中,容器遍历是基础且高频的操作。传统基于下标的for循环虽然功能强大,但代码冗长且容易引入下标越界等错误。范围for循环(Range-based for loop)作为C++11引入的语法糖,其核心原理是通过自动调用容器的begin()和end()函数获取迭代器,在编译期展开为等价的迭代器循环,从而让开发者更专注于业务逻辑而非迭代细节。这一特性体现了声明式编程思想,显著提升了代码的可读性和安全性。在工程实践中,范围for循环与STL容器(如vector、map)无缝集成,通过传引用方式避免不必要 阅读详情
#include "pch.h"
#include <cstddef>
#include <iostream>
#include <stdexcept>

template <typename T>
class CustomVector {
private:
    T* data;
    size_t size;
    size_t capacity;

public:
    // Iterator class
    class Iterator {
    private:
        T* ptr;
    public:
        Iterator(T* p) : ptr(p) {}

        T& operator*() { return *ptr; }
        T* operator->() { return ptr; }

        Iterator& operator++() { ++ptr; return *this; }
        Iterator operator++(int) { Iterator tmp = *this; ++ptr; return tmp; }

        bool operator==(const Iterator& other) const { return ptr == other.ptr; }
        bool operator!=(const Iterator& other) const { return ptr != other.ptr; }
    };

    CustomVector() : data(nullptr), size(0), capacity(0) {}

    ~CustomVector() { delete[] data; }

    void push_back(const T& value) {
        if (size == capacity) {
            size_t new_capacity = capacity == 0 ? 1 : capacity * 2;
            T* new_data = new T[new_capacity];
            for (size_t i = 0; i < size; ++i) {
                new_data[i] = data[i];
            }
            delete[] data;
            data = new_data;
            capacity = new_capacity;
        }
        data[size++] = value;
    }

    T& operator[](size_t index) {
        if (index >= size) throw std::out_of_range("Index out of range");
        return data[index];
    }

    size_t get_size() const { return size; }

    // Methods to support range-based for loop
    Iterator begin() { return Iterator(data); }
    Iterator end() { return Iterator(data + size); }
};

// Example usage
int main() {
    CustomVector<int> customVec;
    customVec.push_back(1);
    customVec.push_back(2);
    customVec.push_back(3);

    for (auto& c : customVec) {
        // This loop now works!
        std::cout << c << " ";
    }
    std::cout << std::endl;

    getchar();

    return 0;
}

C++11新版本“for的使用“和“auto“ 官方给出的回答是,如下: C++11将auto用于实现自动类型判断。这要求进行显示初始化,让编译器能够将变量的 类型设置为初始值的类型。 auto maton = 112 ; // maton is type int auto pt = &maton ; // pt id type int * double fm ( double , int ) ; auto pf = fm ; // pf is type double () (double , int ) 关键字auto还可简化模板声明。 例: 阅读详情

相关推荐

C++11新特性:for循环遍历容器的新用法

一、普通的for循环 #include<iostream> #include<vector> using namespace std; vector<double> a; int main() { a.push_back(1.2); a.push_back(50.56); a.push_back(8.33333); //普通for循环 for (int i=0; i<a.size(); i++)

马小超 8136

C/C++ for循环的几种用法

你以为for循环就只有常用的那用吗?这你可就错了,还有两种C++11新标准的用法。

cpp_learner的博客 3万+

OpenClaw 企业级自动化系统架构设计与实现

本文介绍基于 OpenClaw 构建的企业级自动化系统的完整架构设计、技术选型、实现细节和性能优化方案。

2604_95445636的博客 482

1.7:范围for

范围for的定义,范围for使用的方法,范围for使用的要点

weixin_63716012的博客 343

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4867

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1566

C++--范围for循环详解

基本语法、与普通for循环对比、关键特点、底层原理、使用示例、修改元素、只读场景、支持的数据类型、注意事项、应用场景

2302_80868583的博客 705

Sylvester结式法求解多项式方程

Sylvester结式法,结式,消元法,ctfshow 七夕杯 LUCK7,crypto,WriteUp

u010883831的博客 4532

cpp学习笔记 for打印数列

for打印数列的四种方式

rainssssss的博客 155

用python自动复制粘贴excel表里某一列的数据到另一个表中

昨天接到人事小姐姐求助减轻复制粘贴的重复工作量,分享一下代码 半路新手上路 耶 把 2.xlsx 表里的第二列 的数据复制粘贴到 test.xlsx的第一列 python3.6.2 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.writer.excel import Exc...

weixin_33854644的博客 2万+

Circos图审美拯救计划:用TBtools复刻Nature级共线性分析图谱

本文针对Circos图在共线性分析中的审美提升问题,提供了一套基于TBtools的完整优化方案。通过构建和谐的色彩体系、精细控制信息层布局以及模仿顶刊构图逻辑,详细讲解了如何从配色、透明度、标签显示到高级参数设置,将默认图表升级为具有高级学术美感的Nature级图谱,助力研究者提升论文图表质量。

cherry的博客 911

C/C++ for循环 while循环 do..while循环的使用

C/C++ for循环 while循环 do..while循环的使用

wendyWJGU的博客 1120

V-Mamba:2D 选择性扫描状态空间模型图像分类

V-Mamba CIFAR-10 分类链路:32² RGB → Stem Conv (3→64ch, stride2→16²) → VMambaBlock ×4 (SS2D 四方向 → Mamba S6 扫描 → MLP) → GAP → Linear → 10 类。核心贡献:SS2D 四方向扫描将 2D 空间建模转为 4 个 1D 序列, 计算复杂度从 O(N²) 降至 O(N)。建议先从 CIFAR-10 dim=64 depth=4 验证 SSM 收敛性;

FJN110的博客 70

C++11 统一列表初始化+std::initializer_list

只要类有对应的构造函数,直接用{}class Datepublic:cout << "Date构造函数调用" << endl;int _month;int _day;int main()// C++98 老式写法// C++11 列表初始化// 带=也支持return 0;✅ 效果:三种写法都能正常调用构造函数,语法更统一、更直观。

m0_73919066的博客 466

如何使用 Conda 安装 Qiskit(详细教程)

本文介绍了使用conda安装Qiskit量子计算工具包的完整流程。首先创建Python 3.10的conda虚拟环境(qiskit_env),然后安装Qiskit核心包及可视化组件(注意Mac用户的安装命令差异)。接着注册IPython内核并测试环境,通过量子电路创建与可视化演示验证安装成功。该教程为量子计算开发提供了简洁的环境配置指南,适合研究者和开发者快速搭建Qiskit开发环境。

猿小白的博客 565

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++用for遍历自定义类

正确的做法是像STL容器那样,创建一个迭代器类,然后里面重载 !=(比较), ++(递增),*(解引用) 这几个函数。 例如: template <class T> class iterator { private: T* _data; protected: public: // 构造函数,传进迭代器管理的值 iterator(T* data_) : _data(data) {} bool operator !=(const iterator& that) { //

Muzzik的博客 3415

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C++】STL容器-string的遍历

在C++的标准模板库(STL)中,string作为一种常用的容器,扮演着存储和操作字符串的重要角色。本文将深入探讨STL中string容器的遍历方法,包括使用迭代器、指针、范围for循环以及std::for_each算法等多种方式。通过具体示例和代码实践,读者将能够熟练掌握string容器的遍历技巧,并在实际编程中灵活运用。

池央的博客 3889

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

二叉树的遍历 (C++实现)

本文涉及三种常见的遍历方式 : 先序遍历、中序遍历、后序遍历,以及用C++实现的非递归版本代码。 首先我们定义一下二叉树结点类 struct BinaryTreeNode { int val; BinaryTreeNode* leftchild; BinaryTreeNode* rightchild; BinaryTreeNode(int const&amp; _val, Bina...

zhhp1001的博客 3万+

C++ for(char c:s)遍历字符串 增强型for循环

C++ for(char c:s)遍历字符串 相当于C++的: for( int i = 0; i < s.length(); i++) { s[i].... } 使用 for (char c : s) 时会复制一个s字符串再进行遍历操作,而使用 for (char& c : s) 时直接引用原字符串进行遍历操作,由于复制一个字符串花费了大量的时间,所以第一种解法要快于第二种解法。 ...

weixin_40162095的博客 2万+

C++中遍历字符串

1.普通 for 循环 2.C++中迭代器的使用 3.范围 for 的使用

奔赴在热爱征程上的小小孩~ 2万+

C++几种for循环遍历容器方式

C++11几种for循环遍历容器方式1.原始遍历方式2.基于范围得for循环遍历方式3.借助的for_each算法遍历 1.原始遍历方式 std::vector<int> arr; //... for(auto it = arr.begin(); it!=arr.end; ++it) { std::cout << *it << std::endl; } 2.基于范围得for循环遍历方式 只读方式遍历,如果希望修改数据,可以在n前加&符号,如果希望

qq_38493448的博客 1986

C++11新特性之基本范围的For循环(range-based-for)

Range-Based-For 熟悉C++98/03的对于for循环就再了解不过了,如果我们要遍历一个数组,那么在C++98/03中的实现方式: int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout 而遍历容器类的For如下: std::vector vec {1,2,3,4

hailong0715的专栏 6万+

C++11 for区间遍历:vector几种遍历方式

近来,基本上所有现代编程语言都有一种对一个区间写for循环的便捷方式。最终,C++也有了相同的概念;你可以给循环提供一个容器,它帮你迭代。 example: #include <iostream> #include <vector> #include <map> using namespace std; int main() { vector<int> num{3, 7, 1, 7, 9}; // 修改你正在迭代的容器的值,或者你想避

Hello World 1万+

C++实现已知二叉树前序遍历和中序遍历,求后序遍历

一、基本概念 1.先序遍历(NLR)可以确定二叉树的父子结点; 2.中序遍历(LNR)可以确定二叉树的左右子树; 3.后序遍历(LRN)可以确定二叉树的父子结点; 二、结论 1.已知先序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,可以得出二叉树的后序遍历; 2.已知后序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,进而可以得出二叉树的先序序列; 3.综上,必须含有中序遍历(确定...

MK422的博客 1万+

C++11范围for循环:高效遍历新方式

C++11引入的基于范围的for循环(range-based for loop)简化了容器和数组的遍历。其语法为for(declaration:range_expression),自动处理迭代过程,无需手动管理索引。相比传统遍历方式,它更简洁安全,支持修改元素(使用引用)或只读访问。底层基于迭代器实现,要求遍历对象提供begin()/end()方法。注意事项包括:区分引用与拷贝、避免修改容器大小、不支持直接获取索引等。该特性提升了代码可读性和安全性,是现代C++推荐的遍历方式。

祯的博客 1186

C++的几种遍历形式

引言 看到了STL中的for_each遍历算法,看完后第一感觉就是for_each能做的用for循环也照样可以啊,于是归类了几种遍历形式,在这里总结一下; 在这里说一下为什么C++中有这么多种的遍历形式,主要因为C++是多范式语言,通俗来说就是有什么就加什么,只要你能用的舒服就行; 下面罗列四种遍历方式; 以vector类为例: 先定义一个vecctor和写一个输出函数,为了统一,这里先来一个模板: #include<iostream> #include<vector> #inclu

YXXXYX的博客 9555
上一篇: Curiously Recurring Template Pattern(CRTP)
下一篇: vscode 配置 setting json bgfx shader
不如学也
博客等级 码龄12年 22粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值