c – end()以什么方式指向非连续容器中的“一个接一个”?

c – end()以什么方式指向非连续容器中的“一个接一个”?,第1张

概述根据 this和 this问题中的答案,C标准在第23.2.1节中声明end()对于所有stl容器具有恒定的时间复杂度. 如果我理解正确: > std :: forward_list只知道它的第一个元素,每个列表条目只知道下一个元素. >列表在内存中是不连续的 > a.begin()== a.end()对于空容器a为真 > end()应该是一个指向’一个超过容器结尾的’的迭代器 因此,在对forw 根据 this和 this问题中的答案,C标准在第23.2.1节中声明end()对于所有stl容器具有恒定的时间复杂度.

如果我理解正确:

> std :: forward_List只知道它的第一个元素,每个列表条目只知道下一个元素.
>列表在内存中是不连续的
> a.begin()== a.end()对于空容器a为真
> end()应该是一个指向’一个超过容器结尾的’的迭代器

因此,在对forward_Lists进行一些循环时,我想知道:

在forward_List的情况下,end()如何具有恒定的时间复杂度(即,不会超过’结束一个’)?

我查看了forward_List.cpp并找到了声明

iterator       end() _NOEXCEPT    {return       iterator(nullptr);}

这对于恒定的时间要求是有意义的,但不适用于与上述第4点相对应的 – 公认的规则 – 规则.

所以仍有一些问题:

>什么是’一个接一个’应该意味着非连续存储?
> nullptr如何符合’一个接一个’的定义?
>如果MyForwardList为空,MyForwardList.begin()== MyForwardList.end()如何为true?
>为什么不将end()始终定义为nullptr?

解决方法

What is one past the end supposed to mean for non-contiguous storage?

这意味着如果将迭代器增加到最后一个元素,您将获得什么.

How does nullptr fit the deFinition of ‘one past the end’?

如果你将迭代器增加到最后一个元素,那就是你得到的,那么它符合定义.

How is MyForwardList.begin() == MyForwardList.end() true if MyForwardList is empty?

对于一个空列表,它们都返回相同的内容.可能是一个“空”的迭代器.

Why isn’t end() always defined as nullptr?

因为有时这不是定义它的最方便的方法,只要你满足要求,你就可以随意实现它.

它基本上只是一个循环定义.如果你把迭代器带到列表中的最后一个元素并递增它,那么end函数会返回你得到的任何东西,或者对于一个空列表,返回相同的东西,begin返回.只要所有这些关系成立,一切都有效,无论您使用什么内部价值观或逻辑来保证关系.

总结

以上是内存溢出为你收集整理的c – end()以什么方式指向非连续容器中的“一个接一个”?全部内容,希望文章能够帮你解决c – end()以什么方式指向非连续容器中的“一个接一个”?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1222108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存