c++ - 为什么向量的 .at() 成员函数返回引用而不是迭代器?
问题描述
直到几天前,我还认为 a 的所有与“位置”相关的成员函数都vector
返回了一个iterator
. 我最近发现 whileinsert()
和erase()
函数确实返回iterators
,begin()
并且end()
按照定义这样做,但是像at()
,front()
之类的函数back()
不这样做,它们返回一个简单的引用。
虽然引用使生活更轻松,因为我不必取消对iterator
拳头的引用,但对我来说,某些成员函数返回引用而不是迭代器似乎仍然不一致。如果有的话,C++ 试图通过提供最低限度的同时仍然保持编程的简易性来最大限度地减少这种不一致。
解决方案
at
方法来自称为“元素访问”的一组常见容器方法,这些方法返回引用、指针。还有另一组称为“迭代器”的通用容器方法,它们返回迭代器。标准库的设计决策清晰、简单且众所周知。
元素访问
at
: 使用边界检查访问指定元素operator[]
: 访问指定元素front
: 访问第一个元素back
: 访问最后一个元素data
直接访问底层数组
迭代器
begin
/cbegin
返回一个迭代器到开头end
/cend
返回一个迭代器到最后rbegin
/crbegin
将反向迭代器返回到开头rend
/crend
返回一个反向迭代器到最后
在迭代器概念中,迭代器范围内的元素通过std::advance
STD方法访问。这适用于InputIterator
s、BST、列表、向量等,当然具有不同的复杂性。
推荐阅读
- braintree - Braintree Sandbox API 上的突然失败请求:“计费状态格式无效”
- swiftui - SwiftUI iOS14 - 禁用键盘回避
- matrix - 良好的训练和验证准确性,但混淆矩阵较差
- arrays - 二维数组的右旋转
- windows-server-2016 - Windows Server 2016 在重新启动时也将共享文件夹永久挂载为光盘
- android - 为用户创建单个帐户的 LinkWithCredentials 流程帮助
- c - OpenvVMS将char参数数组从pascal传递给C函数
- r - R - 分面饼图
- parallel-processing - CUDA 块与线程和 SMP 之间的关系
- django - 在 microsoft dynamics 内的 iframe 中打开的 django webapp 中的自动登录