`std :: back`类似C ++中的函数

问题描述

我可以使用std::begin()std::end()创建开始和结束迭代器。
例如:

int arr[4][4] = <something here>;
auto begin_it = std::begin(arr);
auto end_it = std::end(arr);

但是,为什么我们没有std::front()std::back()。有什么特定的原因可以忽略它们吗?

除了课程的开始和结束,我是否可以使用任何类似的功能

解决方法

并非所有容器都可以恒定时间访问列表的最后一个元素。

std::forward_list

,

就像Marshall Clow所说的那样,应该考虑跨容器的访问时间不一致。

我的观点是,front会导致UB在空的或未定义的front容器上频繁发生,但是只要不取消引用,begin都不会导致UB。

std::vector v;
auto item = front(v); // This line immediately cause undefined behavior.

如果std::front存在,可能会带来更多的麻烦,而不是带来的便利。

因为每次调用front都必须在empty之后。然后,这是两个函数调用,以使其变得方便。

HMM ..方便吗? 尽管程序员可以通过front自觉获得*begin( container ),并在检查之前使用它。

,

是否有任何特定的原因被忽略?

是否有任何特定原因包含

事物不会仅仅因为可以被扔到标准库中。标准库旨在由有用函数,模板等组成。 “举证责任”在于想要包括某些东西的人。只有在建立了用例并将其提交给标准委员会并由该委员会驳回之后,才可以称其为“省略”是正确的。

话虽如此,标准库中未包含某些内容,可能有多种原因,“无用”只是其中之一。其他潜在的原因包括“在所有平台上的实现都不够好”和“哦,我们没有想到这一点”。尽管我不知道哪种原因适用于此,但我可以通过将std::end()与假设的std::back()进行比较来提供一些思考的机会。

一个人可以将std::end()与C样式的数组(已知大小)一起使用,也可以将符合"Container"要求的任何东西(例如标准库中的所有容器)一起使用。它在循环容器方面具有很大的实用性,这是相当普遍的操作。向标准库中添加std::end()的结果是,标准库中的许多算法不再需要模板专用化来处理C样式的数组。 (不可否认,基于范围的for循环具有类似的效果。)

一个人可以将std::back()与C样式的数组(已知大小),std::array或满足"SequenceContainer"要求的任何东西一起使用,例如字符串,向量,双端队列,列表和转发列表(标准库中没有其他内容)。它可用于...嗯... 我正在绘制一个空白,但我将为back()提供一般用途的可能性,尽管可能远远不及常见为循环。

由于std::back()在少于std::end()的情况下适用,因此它可能被忽略了。同时,由于std::back()在少于std::end()的情况下适用,因此它可能不符合包含在标准库中的“有用”标准。

除了课程的开始和结束,我是否可以使用任何类似的功能?

您可以从C样式的数组切换为std::array,然后使用std::array::back()。毕竟,std::array只是一个C样式的数组,包裹起来看起来像一个连续的序列容器。类型声明较长,但是您要查找的功能变得很容易使用。

标准库的目标是支持C样式数组,因为它是一个库,注定要由该库的作者梦dream以求的代码使用。如果您不是在编写库,则可能实际上不需要支持C样式的数组。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...