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

kes*_*Him 5 c++ containers libstdc++

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

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

但是,为什么我们没有std::front()std::back()。是否有任何特定原因可以省略它们?

我可以使用任何类似的功能(当然除了开始和结束)?

Mar*_*low 5

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

std::forward_list 例如。


JaM*_*MiT 3

是否有任何特定原因导致它们被省略?

有什么具体原因让他们被包括在内吗?

事物不会仅仅因为可以就被放入标准库中。标准库旨在由有用的函数、模板等组成。“举证责任”在于想要包含某些内容的人。只有在建立了用例、提交给标准委员会并被该委员会驳回之后,才能准确地将某些内容称为“省略”。

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

可以使用C 风格的数组(已知大小)或任何满足“Container”std::end()要求的东西,例如标准库中的所有容器。它在循环容器方面非常有用,这是一种相当常见的操作。添加到标准库的结果是标准库的许多算法不再需要模板专门化来处理 C 样式数组。(诚​​然,基于范围的 for 循环也有类似的效果。)std::end()

人们可以使用std::back()C 风格的数组(已知大小)、 a或任何满足“SequenceContainer”std::array要求的东西,例如字符串、向量、双端队列、列表和前向列表(并且没有来自标准的其他内容)图书馆)。它有实用性...嗯...我正在画一个空白,但我会授予一般用途的可能性 for ,尽管可能远没有像循环那样常见。back()

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

我可以使用任何类似的功能吗(当然除了开始和结束)?

您可以从 C 样式数组切换到std::array,然后使用std::array::back(). 毕竟,std::array它只是一个 C 风格的数组,包装起来看起来像一个连续的序列容器。类型声明更长,但您正在寻找的函数变得容易使用。

标准库的目标是支持 C 风格数组,因为它是一个库,注定会被库的作者从未梦想过的代码所使用。如果您不编写库,那么您可能并不真正需要支持 C 样式数组。