std :: size_t vs size_t vs std :: string :: size_type

时间:2011-12-14 16:19:44

标签: c++

  • 当我没有包含任何内容时size_t来自哪里?
  • 始终假设size_t == std::size_t
  • 是否合理
  • 我应该何时使用size_type容器中的stdstring::size_typevector<T>::size_type等)?

3 个答案:

答案 0 :(得分:10)

  

当我没有在空项目中包含任何内容时,size_t来自哪里?

如果您没有包含任何内容,则无法使用size_t。它在<stddef.h>中定义(也可能在<cstddef>中定义,如果您的标头版本将定义放在全局名称空间中以及std)。

  

总是假设size_t == std :: size_t?

是否合理

是。只要包含相应的C ++标头(例如std而不是<cstddef>

,C库定义的所有类型和函数都包含在<stddef.h>命名空间中。
  

我什么时候应该使用std :: _ :: size_type?

您的意思是某些标准类和模板(例如size_type)中定义的vector类型吗?如果您愿意,可以在使用这些类时使用它们。在大多数情况下,您会知道它与size_t相同,所以您不妨使用它并节省一些输入。如果您正在编写通用代码,而您不知道该类是什么,那么最好使用size_type以防它与size_t不兼容。

例如,您可能希望编写一个容器,用于容纳比size_t所表示的更多的项目。您可以使用某种大数字类型来表示容器的大小,该大小不能转换为size_t。在这种情况下,像size_t s = c.size()这样的代码将无法编译 - 您需要使用Container::size_type代替。

答案 1 :(得分:1)

如果空项目中没有任何内容,size_t来自哪里?

size_t是在C / C ++语言的标准库中定义的基本无符号整数memsize类型。它在"stddef.h" C<cstddef> C++中定义。

头文件"stddef.h"定义的类型位于全局命名空间中,而<cstddef>标头将size_t类型放在命名空间std中。

来自C的

"stddef.h"包含在C ++中以实现兼容性,因此可以在全局命名空间(::size_t)和std命名空间(std::size_t中找到该类型)。

答案 2 :(得分:0)

size_t<cstddef>中定义,位于std名称空间中。