c++中如何获取数组下标_c++查找元素在数组中的位置【详解】
发布时间 - 2026-01-31 00:00:00 点击率:次推荐用 std::find 获取下标:先用 std::find 找到迭代器,再减去起始迭代器得下标;对 vector 可用 std::distance,语义更明确且兼容所有容器,但需先判断是否找到。
用 std::find 获取元素下标(推荐)
直接用 std::find 找到迭代器,再减去数组起始地址,就是下标。它适用于所有标准容器和原生数组,且语义清晰、不易越界。
注意:如果没找到,返回的是尾后迭代器,此时计算下标会得到非法值,必须先判断。
int arr[] = {10, 20, 30, 40, 50};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 30;
auto it = std::find(std::begin(arr), std::end(arr), target);
if (it != std::end(arr)) {
int index = it - std::begin(arr); // 下标是整数差,不是指针减法的字节数
std::cout << "found at index: " << index << "\n"; // 输出 2
} else {
std::cout << "not found\n";
}
对 std::vector 用 std::distance
当数组封装在 std::vector 中时,std::distance 更通用,尤其适合非随机访问迭代器(虽然 vector 是随机访问,但写法更一致)。
-
std::distance内部对随机访问迭代器做减法,和直接相减等价,但语义更明确 - 对
list或forward_list也能用(只是性能为 O(n)) - 不要对空容器调用
std::distance(begin, end)以外的组合,可能未定义行为
std::vectorvec = {10, 20, 30, 40}; auto it = std::find(vec.begin(), vec.end(), 30); if (it != vec.end()) { auto index = std::distance(vec.begin(), it); // 返回 size_t 类型 std::cout << "index: " << index << "\n"; // 输出 2 }
手写循环时避免常见越界错误
手动遍历看似简单,但容易写出 i 或漏判 size == 0 等错误。C++ 中数组下标是 [0, size) 半开区间,这点必须严格遵守。
- 用
size_t作索引变量时,i--在 0 时会绕成极大值,导致无限循环或崩溃 - 比较时别混用有符号/无符号:比如
int i和vec.size()(返回size_t)比较可能触发隐式转换警告或逻辑错误 - 优先用基于范围的 for 循环 + 计数器,比裸指针更安全
int arr[] = {5, 15, 25};
size_t n = std::size(arr); // C++17 起推荐,比 sizeof 安全
size_t index = n; // 初始化为无效值
for (size_t i = 0; i < n; ++i) {
if (arr[i] == 15) {
index = i;
break;
}
}
if (index != n) {
std::cout << "found at " << index << "\n";
}查找失败时的返回值处理(关键细节)
几乎所有查找函数都用“尾后位置”表示未找到,但不同接口返回类型不同,容易误用:
-
std::find返回迭代
器 → 必须和
end()比较,不能和nullptr或-1比 -
std::search、std::find_if同理 - 自定义函数若返回
int,应明确约定:-1 表示未找到;但要注意和合法下标(如unsigned容器)冲突 - 对
std::array或std::span,同样适用std::find+ 迭代器差值,无需特殊处理
真正麻烦的不是怎么找,而是后续代码是否统一按“迭代器有效性”来分支——一旦混用 -1 和迭代器判断,很快就会出现静默错误。
# 字节
# c++
# 封装
# 循环
# 迭代
# 未找到
# 的是
# 就会
# 遍历
# 适用于
# 自定义
# 都用
# 几乎所有
# 但要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈javascript alert和confirm的美化
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel storage目录权限问题_Laravel文件写入权限设置
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
大型企业网站制作流程,做网站需要注册公司吗?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在IIS中配置站点IP、端口及主机头?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel如何实现用户密码重置功能?(完整流程代码)
智能起名网站制作软件有哪些,制作logo的软件?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Android GridView 滑动条设置一直显示状态(推荐)
如何用西部建站助手快速创建专业网站?
Android 常见的图片加载框架详细介绍
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何快速搭建个人网站并优化SEO?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何快速使用云服务器搭建个人网站?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Laravel API资源类怎么用_Laravel API Resource数据转换
利用JavaScript实现拖拽改变元素大小
怎么用AI帮你设计一套个性化的手机App图标?
js实现获取鼠标当前的位置
佛山企业网站制作公司有哪些,沟通100网上服务官网?
再谈Python中的字符串与字符编码(推荐)
长沙企业网站制作哪家好,长沙水业集团官方网站?
昵图网官网入口 昵图网素材平台官方入口
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel怎么清理缓存_Laravel optimize clear命令详解
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
html5的keygen标签为什么废弃_替代方案说明【解答】
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
5种Android数据存储方式汇总
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
浅谈Javascript中的Label语句
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
如何用AWS免费套餐快速搭建高效网站?
linux top下的 minerd 木马清除方法
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何快速搭建高效服务器建站系统?
Laravel如何使用Eloquent进行子查询
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】


