【问题标题】:What does size_type in the constructor of vector mean?vector的构造函数中的size_type是什么意思?
【发布时间】:2016-03-17 02:02:45
【问题描述】:

我使用的vector的构造函数规范是:

vector(size_type count, const T& value, const Allocator& alloc = Allocator());

我正在尝试初始化一个向量,但我对 size_type 不是很熟悉。 cplusplus 和 cppreference 都没有size_type 的条目。一个快速的谷歌告诉我它是某种数据类型,用于表示容器之类的大小、容量等(我认为)。我仍然不太确定我是否理解正确或如何使用它。

假设我希望初始化一个计数为(10*n/3) + 1int 向量,其中n 的类型为int。我可以将 count 转换为long 类型吗?我做得对吗?如何理解和使用size_type

请忽略硬件方面的考虑,例如计算机是否可以首先分配足够的内存。稍后我会担心这个,现在我只想专注于理解这个概念。

【问题讨论】:

  • 如果你稍微看一下,vector member types 就在那里。
  • 哦,那部分告诉你类型是什么?我一直不明白如何阅读该部分。

标签: c++ vector type-conversion size-type


【解决方案1】:

这是在std::vector 中定义的typedef;它实际上是std::size_t 的同义词,而后者又是实现定义的无符号整数类型的typedef,该类型能够容纳可能在当前机器上创建的最大对象的大小。在实践中,您可以将其视为某种无符号整数,在引用索引或元素计数时,它始终在整个std::vector 接口中使用。

在“常规”机器(您有 32 位整数)上,如果您的代码中元素计数没有达到“常规”ints 的限制,您可以使用 int 来毫无问题的索引(并且实际上,对于无符号整数的算术/比较产生的细微错误,您会更安全)。

【讨论】:

  • “您实际上更安全地避免了无符号整数上的算术/比较产生的细微错误” 而不是来自无符号整数的错误,您会从有符号整数中获得未定义的行为。很好的建议!
  • 那么如果我希望容纳 long 范围内的值,如何更改 size_type 呢?
  • @dascandy:如果你的向量大小超过 31 位,你会得到未定义的有符号整数溢出行为,这在“正常”程序中是极不可能的;相反,经常发生的事情是使用可能导致负值的索引进行计算(用无符号整数包裹),或者在索引和您周围的其他ints 之间进行比较(默默地“提升”到@ 987654328@)。拜托,让我们停止这个unsigned 索引废话,它比替代方案更痛苦;在 32 位世界中,任何不是位域的东西都没有理由被无符号。
  • @MatteoItalia 也许您更愿意提出一个 C++ 提案来定义有符号整数溢出?那我就不会和你争论了。
  • @thegreatjedi - size_type 已经足够大了。选择它是为了让它可以容纳vector 可以拥有的最大尺寸。
【解决方案2】:

std::vector<T>::size_type 是一个无符号整数类型,可以表示分配模型中最大对象的大小。这通常是std::size_t

除非您认为您会遇到最大积分值,否则您不必担心这一点;只需传入一个整数类型,编译器就会告诉你是否做了一些离谱的事情。

【讨论】:

    【解决方案3】:

    std::size_t 是一种数据类型,它大到足以容纳您的机器可以寻址的任何结构的大小。所以在 32 位机器上,这通常是一个 32 位无符号整数。

    T::size_type 由很多容器定义,通常只重新定义std::size_t(但严格来说不是必须的)。定义它的原因是,您可以只写T::size_type x = T::your_operation(); 而不必考虑您正在使用哪个容器。您可以稍后切换容器,T::size_type 仍然是有效的 C++,不需要返工。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2015-04-11
      • 2011-07-22
      • 2011-03-31
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多