为什么向量的.at()成员函数返回引用而不是迭代器?

Aay*_*jan 0 c++ stl

直到几天前,我还以为所有"位置"相关的成员函数都vector返回了iterator.我发现最近,虽然insert()erase()功能确实返回iterators,begin()end()通过定义这样做,但像功能at(),front(),back()不这样做,他们返回一个简单的参考.

虽然引用使生活更容易,因为我不必取消引用iterator拳头,但对于我来说,某些成员函数返回引用而不是迭代器似乎仍然不一致.如果有的话,C++会尝试通过提供最低限度来最小化这样的不一致性,同时仍然保持编程的简易性.

Yuk*_*uki 9

at方法是从称为"元素访问"的常用容器方法组,那些返回引用,指针.还有另一组称为"Iterators"的常见容器方法,它们返回迭代器.它是标准库的清晰,简单和众所周知的设计决策.

元素访问

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

迭代器

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

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