如何解决`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样式的数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。