C++ 如何获取数组/容器的长度?

2023-05-16

文章目录

    • 一、获取数组的长度
      • 1、sizeof(a)/sizeof(*a)
      • 2、end(a)-begin(a)
    • 二、获取标准库容器的长度
    • 三、数组作为函数参数时,在函数中无法获取其长度

一、获取数组的长度

1、sizeof(a)/sizeof(*a)

C++没有专门求数组长度的内置函数,传统获取 C / C++数组长度的方法是使用 sizeof() 函数:

int a[]={1,2,3,4,5};
cout<<sizeof(a)/sizeof(*a)<<endl;    //5

根据编译器会将数组自动转为指针的性质,*a其实就是 a[0],所以 sizeof(a)/sizeof(a[0]) 就是数组长度。

2、end(a)-begin(a)

学习了STL标准库之后,我们也可以用迭代器begin()和end()来计算数组长度,该方法也适用于所有标准库容器。

int a[]={1,2,3,4,5};
cout<<end(a)-begin(a)<<endl;     //5

这里需要注意:SLT标准库容器使用迭代器的方法是 v.begin()和 v.end(),但数组不能写成 a.begin()和 a.end(),否则会报错。

二、获取标准库容器的长度

两种方法:

vector<int> v={1,2,3,4,5};
cout<<v.size()<<endl;       //5
cout<<v.end()-v.begin()<<endl;     //5

标准库容器可以通过size()成员函数获取其长度,也可以通过迭代器 v.end()-v.begin() 计算容器长度。

三、数组作为函数参数时,在函数中无法获取其长度

C++将数组作为指针来传递,而该指针指向数组的第一个元素。数组作为函数参数传递后,其大小信息丢失,只剩下数组中第一个元素的信息。因此在函数中无法获取其长度。

代码示例:

# x64系统
#include <opencv2\opencv.hpp>
#include <iostream>

void func(cv::Point2d value[]) {
	std::cout << "[func] Array length = " << sizeof(value) / sizeof(*value) << std::endl;
	std::cout << "[func] value = " << value << std::endl;
	std::cout << "[func] sizeof(value) = " << sizeof(value) << std::endl;
	std::cout << "[func] *value = " << *value << std::endl;
	std::cout << "[func] sizeof(*value) = " << sizeof(*value) << std::endl;
}

int main()
{
	cv::Point2d value[3] = { cv::Point2d(0.5,1),cv::Point2d(1,1.5),cv::Point2d(2,2) };
	std::cout << "[main] Array length = "<<sizeof(value) / sizeof(*value) << std::endl;
	func(value);
	return 0;
}

/*
[main] Array length = 3
[func] Array length = 0
[func] value = 000000BF949AFB48
[func] sizeof(value) = 8
[func] *value = [0.5, 1]
[func] sizeof(*value) = 16
*/

输出结果的解释:

*value = [0.5, 1] 储存的是两个double类型的数据,共16个字节;因此 sizeof(*value) = 16
value 是储存cv::Point2d(0.5,1)数据的地址,在x64平台中,一个指针变量(或地址)的大小是8 byte; 因此sizeof(value) = 8

关于更多C++中数组作为函数参数的注意问题可见 C++中数组作为函数参数的注意问题

C++中数组作为函数参数是传址,因此不会保留数组长度信息,想要在函数中获得数组参数的长度,只能把数组长度也作为一个参数传到函数中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 如何获取数组/容器的长度? 的相关文章

随机推荐

  • linux_磁盘挂载

    我挂window磁盘用到的 许多同学挂载后都容易遇到权限不对 xff0c 中文乱码 xff0c 无法执行的问题 我记录一下 在 etc fstab 下加入 dev sda5 home blacklaw programs vfat user
  • 使用SimpleITK读取、保存、处理nii文件

    目录 前言nii格式读取nii成numpy格式将numpy格式保存成nii什么是origin Direction Spacing xff0c 以及如何设置它们示例重采样重采样代码 参考链接 前言 nii gz格式是保存医学图像非常重要一种格
  • Cron表达式详解

    目录 基础通配符说明常用示例参考链接 基础 在编写定时任务执行时间时 xff0c 会用到cron表达式 cron表达式一共有七位 xff0c 从左到右依次为 秒 分 时 日 月 周 年 每位可填的内容如下 序号说明是否必填允许填写的值允许的
  • Python装饰器

    目录 什么是装饰器装饰器不需要传入参数装饰器需要传入参数 什么是装饰器 Python的装饰器类似于Java的注解 xff0c 可以在不侵入原有代码的基础上进行额外的操作 xff0c 比如记录日志等操作 底层的实现相当于将一个函数传入了另一个
  • python ast 详解与用法

    目录 基本概念节点类型ast Assignast Nameast Constantast Callast Attribute 结点的遍历ast源码示例 结点的修改示例 参考链接 基本概念 在 python 中 xff0c 我们可以通过自带的
  • 写写博客:Markdown生僻语法(一) 希腊字母的编辑

    写写博客 xff1a Markdown生僻语法 一 希腊字母的编辑 写博客中间 xff0c 需要用到公式的编写 xff0c 中间有好多希腊字母 xff0c 写不来 xff0c 特此做个总结 xff1a 希腊字母一览表 xff1a Markd
  • 自用向,当树莓派烧录完rikirobot的镜像后怎么把它变为纯净ros镜像

    1 rikirobot已经安装了大部分的ros包 xff0c 具体镜像可以在tb上购买 xff0c 但他是为了主从机而设定的 xff0c 第一步 xff0c 先安装gedit xff08 密码默认123456 xff09 span clas
  • 机器学习:Linear Discriminant Analysis(过程详解+实例代码MATLAB实现

    目录 LDA概念线性判别分析 xff08 LDA xff09 二分类LDA二分类过程举个例子 线性判别分析 多分类LDA多分类过程 Experiment 3 Linear Discriminant AnalysisLDA二分类讲解LDA二分
  • python编程:从入门到实践 笔记

    文章目录 第二章 变量和简单数据类型2 1 运行 hello world py 时发生的情况2 2 变量2 2 1 变量的命名和使用2 2 2 使用变量时避免命名错误 2 3 字符串2 3 1 使用方法修改字符串的大小写name title
  • 网络层——IP协议

    协议格式网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址 协议格式 4位版本号 xff1a 指定IP协议的版本 xff0c 对于IPv4来说 xff0c 就是44位首部长度 xff1a 标识IP报头的长度 xff0c 最小
  • 若依 CAS 6.1 java.io.FileNotFoundException: \etc\cas\thekeystore (系统找不到指定的文件。)

    参考文章 实际上语文水平不过关 xff0c 把cas resources内部的文件全部拷贝到cas overlay template src main resources下
  • 解决通过vnc登陆linux server,在terminal最小化后找不到的问题

    在左边的菜单栏右击 xff0c add new panel xff0c 再右击新添加的add to panel xff0c 然后会让你选择往这个新panel上添加新的菜单 xff0c 把window list添加就好了
  • CSS第二章:2.颜色单位(RGB值、RGBA值)

    总览 一 RGB 1 CSS中能够使用颜色名来使用颜色 2 不使用颜色名 xff0c 我们使用RGB值来描述颜色 3 R red G green B blue 4 每一种颜色的范围在0 255 xff08 0 100 xff09 之间 5
  • 信息化与数字化的区别

    数字化与信息化的区别 今日看到一篇文章 信息化与数字化的核心差异 xff0c 让我重新思考了这两个即熟悉又陌生的名词 xff0c 通过这篇文章和在B站上搜相对应的视频 xff0c 使我大致懂了一些 1 信息化是什么 xff1f 信息化是数据
  • 开启快乐之旅—【C#Winform&认识篇】

    入门学习 简单了解熟悉界简单操作1 xff1a 修改窗体标题2 xff1a 修改窗体图标3 xff1a 窗体出现位置4 xff1a 最大化 xff0c 最小化操作5 xff1a 是否任务栏显示form窗体6 xff1a 窗口大小 简单了解
  • ubuntu磁盘清理

    打开ubuntu software 搜索Bleachbit 安装即可 系统清理工具BleachBit使用 ubuntu清理磁盘空间的多种方法 Ubuntu上释放磁盘空间的几种简单方法 Ubuntu 安装 BleachBit 也可 1 查看电
  • 一些网站资源分享

    链接地址 网站地址 1 博客就是这个博客 2 音乐是我网易云歌单 3 图床是我保存的图库 4 西瓜导航里面有各种网站 5 钟馗之眼是一个爬虫全网某些特征的网站 6 罗马盘是资源网站 7 AI引擎 xff0c 体验智能的感觉 8 优店 xff
  • 软件工程的完整生命周期

    生命周期大体上分为11个步骤 xff0c 如下图 xff1a 第一步 xff1a 概念 创意 需求 产生 xff0c 这个环节一般是项目发起人完成 xff0c 也有可能由产品经理或收到反馈后发起 xff0c 很多时候是会带有这个项目的期望或
  • Qt-设置背景色的几种方式

    最近设置背景色 xff0c 被背景色搞得晕头转向 xff0c 然后总结了一下用过的方法与踩过的坑 xff0c 希望大家有所帮助 QLabel label 61 new QLabel CSS样式 xff0c 直接设置样式 xff0c 该方法对
  • C++ 如何获取数组/容器的长度?

    文章目录 一 获取数组的长度1 sizeof a sizeof a 2 end a begin a 二 获取标准库容器的长度三 数组作为函数参数时 xff0c 在函数中无法获取其长度 一 获取数组的长度 1 sizeof a sizeof