当前位置: 首页 > news >正文

c++ 如何给数组批量赋值--利用结构定义数组以提高程序的可读性

编程久了,时不时总会碰到些不断重复的的小问题,

比如:

int ar[3] = {1,2,3};

int br[3] = {10,11,12};

如何使完成赋值操作:br=ar 

memcpy是一个办法,但程序可读性不强。更不可忍受的是下面这样的代码(想像一下一个工程中往往要用多少数组吧):

for(int i=0; i<3; i++){
    ar[i] = br[i];
}

通常我的办法是改变定义方式,直接用结构定义数组,简单的代码如下,


#include <iostream>
#include <assert.h>

struct A {
    int& operator[](const int id) {
        return v[id];
    }
    int v[3] = { 4,5,6 };
} as, bs;

int main()
{
    bs = { 1,2,3 };
    as = { 10,11,12 };
    as = bs;
    as[0] = 100;

    int* p1 = &as[1];
    int* p2 = &as.v[1];
    assert(p1 == p2);   // as[] 就是as.v[]

    std::cout << as[0] << " " << as[1] << " " << as[2] << " " << std::endl;;
}

引发的问题:

这样定义之后,正常情况下都OK,但有一种特殊情况,getter 为const的情况下,需要特殊处理,

class testme {
public:
    A rot = { 1,2,3 };
    int getter(int index) const;
};

int testme::getter(int index) const {
    int index = 0;
    return rot[index];   // 不允许,因为函数放数据的空间已经成了const
    return rot.v[index]; // 没问题,直接返回的是数值,和放数据的空间无关
}

 

相关文章:

  • c++ windows 之下 CreateThread vs CreateProcess
  • libusb源码学习:list_entry
  • libusb源码学习:几个函数加载的宏(windows)
  • MCU_如何通过硬件VID 查找生产厂家
  • MCU_WireShark USB抓包内容解析
  • MCU_Wireshark USB 抓包过滤(抓特定端口地址)
  • STM32F4xx usb库源码详解 custom HID
  • STM32F4xx usb库源码详解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo
  • Libuv 1.34.2 源码详解 ---- 以uvCat为例讲解
  • 步进电机的细分驱动中1-2相, W1-2相, 2W1-2相, 4W1-2相 表示什么意思?
  • MCU_关于STM32Fxxx中断EXTI产生时多次(两次)进入中断的原因
  • MCU_通过windows串口API控制RTS和DTR
  • MCU_STM32的HAL库中的宏DMA_FLAG_TCIF0_4/DMA_FLAG_TCIF1_5/DMA_FLAG_TCIF2_6/DMA_FLAG_TCIF3_7
  • LWIP_TCP如何理解数据发送,何时使用tcp_recved函数
  • MCU_使用STM32CUBEMX配置STM32F107/407 RMII-ETHERNET要注意的细节:PHY Address和MCO时钟
  • hexo+github搭建个人博客
  • __proto__ 和 prototype的关系
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Git初体验
  • happypack两次报错的问题
  • Java方法详解
  • Koa2 之文件上传下载
  • nfs客户端进程变D,延伸linux的lock
  • React 快速上手 - 07 前端路由 react-router
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 笨办法学C 练习34:动态数组
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何进阶一名有竞争力的程序员?
  • 使用Swoole加速Laravel(正式环境中)
  • 找一份好的前端工作,起点很重要
  • 说说我为什么看好Spring Cloud Alibaba
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Panda3d 碰撞检测系统介绍
  • #pragma pack(1)
  • (2022 CVPR) Unbiased Teacher v2
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (8)STL算法之替换
  • (二)学习JVM —— 垃圾回收机制
  • (分布式缓存)Redis持久化
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (四)鸿鹄云架构一服务注册中心
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)程序员技术练级攻略
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Micro Framework初体验(二)
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示