首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >size()必须为== ()- begin()?演员阵容怎么样?

size()必须为== ()- begin()?演员阵容怎么样?
EN

Stack Overflow用户
提问于 2012-07-26 08:37:57
回答 2查看 2.9K关注 0票数 19

据我所知,size_typedifference_type的目的是,而不仅仅是 --它也是为了解决例如分段架构之类的,它们可能有不同的大小。

在这种情况下,如果我有一个带有随机访问迭代器的容器,那么在difference_typesize_type值之间随意执行static_cast对我来说安全吗?理由是,当其中任何一个都被强制转换时,end() - begin()必须始终等于size()

(例如,用例是创建一个容器,它的大小等于两个迭代器之间的元素数,或者相反:将某个大小的容器复制到迭代器分隔的范围内。)

在转换之前有什么我应该注意的(例如数据丢失)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 09:05:05

以下是C++11 standard在这里对各种事情的看法:

§23.2.1

代码语言:javascript
复制
Expression: difference_type
Return Type: signed integer type
Operational Semantics: -
Assertion/note, pre-/post-condition: is identical to the difference type of iterator and const_iterator
Complexity: compile-time

Expression: size_type
Return Type: unsigned integer type
Operational Semantics: -
Assertion/note, pre-/post-condition: size_type can represent any non-negative value of difference_type
Complexity: compile-time

Expression: size()
Return Type: size_type
Operational Semantics: distance(begin(),end()) 
Assertion/note, pre-/post-condition: -
Complexity: constant

让我们确保size()等同于end() - begin()

§24.4.4/4

代码语言:javascript
复制
distance():
Effects: If InputIterator meets the requirements of random access iterator, 
returns (last - first); otherwise, returns the number of increments needed 
to get from first to last

因为您的容器有随机访问迭代器,所以这是正确的。就是这样。正如您在第一个框中看到的,

代码语言:javascript
复制
size_type can represent any non-negative value of difference_type

由此可以看出,从difference_typesize_type的转换对于所有非负值都是有效的。

票数 12
EN

Stack Overflow用户

发布于 2012-07-26 08:50:32

我不认为它总是安全的。这个历史问题从C语言的第一个规范开始就存在了,在第一个规范中,ptrdiff_t不能保证覆盖size_t的整个正范围。由于显而易见的原因,这个问题延续到了std::vector的规范中。

使用标准的C++容器,可以保证size_type覆盖difference_type的非负范围,但不保证反向覆盖。

但是,标准容器的size()end() - begin()之间的关系可以通过其他方式来保证。该实现可以自由地对最大容器大小施加自己的限制,这些限制是通过container::max_size()函数公开的。它可以人为地限制最大大小,以确保减法永远不会溢出。

附注:我想说的是,difference_type存在的原因只是一个符号,而不是其他。为了完全“安全”,difference_type应该比size_type长一点。这在实践中通常很难实现,这就是为什么语言规范不需要它的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11660774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档