首页 > 解决方案 > 为什么向量的 .at() 成员函数返回引用而不是迭代器?

问题描述

直到几天前,我还认为 a 的所有与“位置”相关的成员函数都vector返回了一个iterator. 我最近发现 whileinsert()erase()函数确实返回iteratorsbegin()并且end()按照定义这样做,但是像at(),front()之类的函数back()不这样做,它们返回一个简单的引用。

虽然引用使生活更轻松,因为我不必取消对iterator拳头的引用,但对我来说,某些成员函数返回引用而不是迭代器似乎仍然不一致。如果有的话,C++ 试图通过提供最低限度的同时仍然保持编程的简易性来最大限度地减少这种不一致。

标签: c++stl

解决方案


at方法来自称为“元素访问”的一组常见容器方法,这些方法返回引用、指针。还有另一组称为“迭代器”的通用容器方法,它们返回迭代器。标准库的设计决策清晰、简单且众所周知。

元素访问

  • at: 使用边界检查访问指定元素
  • operator[]: 访问指定元素
  • front: 访问第一个元素
  • back: 访问最后一个元素
  • data直接访问底层数组

迭代器

  • begin/cbegin返回一个迭代器到开头
  • end/cend返回一个迭代器到最后
  • rbegin/crbegin将反向迭代器返回到开头
  • rend/crend返回一个反向迭代器到最后

在迭代器概念中,迭代器范围内的元素通过std::advanceSTD方法访问。这适用于InputIterators、BST、列表、向量等,当然具有不同的复杂性。


推荐阅读