繁体   English   中英

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

[英]Why does .at() member function of a vector return a reference instead of an iterator?

直到几天前,我还认为vector所有与“位置”相关的成员函数都返回了iterator 我最近发现,虽然insert()erase()函数确实确实返回了iterators ,但begin()end()确实按定义返回了iterators ,但是at()front()back()类的函数却没有这样做,他们返回一个简单的参考。

虽然引用使生活变得更加轻松,因为我不必取消引用iterator拳头,但对我来说,仍然有些矛盾,某些成员函数正在返回引用而不是迭代器。 如果有的话,C ++会通过提供最低限度的方法来尽量减少此类不一致性,同时仍保持编程的简便性。

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

元素访问

  • at :通过边界检查访问指定的元素
  • operator[] :访问指定的元素
  • front :访问第一个元素
  • back :访问最后一个元素
  • data直接访问基础数组

迭代器

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

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

begin()end()insert()erase()等是对向量本身的元素序列起作用的方法,而operator []at()front()back()是方法访问此序列的具体元素。 我在这里看不到任何不一致之处。 它们存在于所有序列容器中,并且在概念上总是做相同的事情。 当然,您可以自己实现诸如front()back()东西,没有什么可以阻止您这样做。 根据定义,它们等效于分别取消引用begin()prev(end()) 它们的存在是为了方便。 根据您想走多远, std::vector本身的存在只是为了方便……

标准模板库提供的抽象是序列迭代器算法 容器是创建和管理序列的一种方法,但不是唯一的方法。 例如,通过创建std::istream_iterator ,可以将输入流用作序列。 但是像int i; double d; std::cin >> i >> d;这样的东西int i; double d; std::cin >> i >> d; int i; double d; std::cin >> i >> d; 如果std::cin 定义了一个基于迭代器的接口,则编写起来会很尴尬。 容器也是一样:它们在迭代以外的环境中很有用,并且它们定义了适合其一般用途的接口; 这些用途之一是作为STL算法的序列,但也有其他用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM