![](/img/trans.png)
[英]Why does the std::find for vector return a iterator instead of the integer position
[英]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.