向量索引变量声明(size_t或std::vector<DATATYPE>::size_type)

3
什么是声明一个新变量与向量大小比较的最佳实践?在以下选项中,我们应该选择哪个(即double向量)?
1. uint compareVar; 2. std::uint64_t compareVar; 3. std::size_t compareVar; 4. std::vector<double>::size_type compareVar; //这与size_t有何不同? 为什么要这样做?

size_t 取决于环境(32/64位、编译器等),这也是标准 vector::size 的实现方式。 - undefined
3个回答

3
你必须使用的类型是std::vector::size_type。通常是std::size_t,但标准并未规定它。可能有一些实现会使用其他类型。当你想引用std::vector的大小时应该使用它。
不应该使用uintuint64_t甚至size_t,因为在每个实现和平台下,底层的向量实现可能会使用不同的类型。

是的,但是不能保证 std::vector::size_type 总是等于 size_t - undefined
https://stackoverflow.com/a/4849780/9304999 - undefined

1
按照“好处”排序:4 3 1 2。 std::vector::size_type 是一种实现定义的无符号整数类型,保证能够索引任何向量中的所有元素。使用它是很好的选择,因为它保证在所有情况下至少足够大,但不需要比这更大。 std::size_t 是一种实现定义的无符号整数类型,保证能够表示任何对象的大小。通常情况下,std::vector::size_type 与此相同,但在理论上不能保证。 uint 在C++中没有这种类型,但我假设你指的是 unsigned。这不能保证能够表示向量的所有索引。实际上,在普遍存在的64位系统上,unsigned 的最大可表示值通常远远小于最大可能的向量。尽管如此,如果您知道上限在您的程序中要小得多,则使用它可能是可以的……只要这种假设永远不会改变。

std::uint64_t是一种无符号类型,在所有系统上都不能保证存在,并且不能保证足够大以表示向量的所有索引,尽管在64位系统和具有更小地址空间的系统上可能足够,这基本上涵盖了目前几乎所有的计算机。


1
如果您只需要进行等式或顺序比较,最好使用向量实现中使用的类型。
std::vector<MyType>::size_type compareVar

这样可以确保您使用的类型与矢量实现的类型匹配,无论平台如何。

请注意,由于类型是无符号的,计算矢量大小和compareVar之间的差异需要一些谨慎,以避免从较小的值中减去较大的值而导致不正确的结果。


谢谢。但是 size_t 不也是同样的吗?它不也是跨平台的吗? - undefined
1
@Bu_ali size_t确实是与平台无关的,但std::vector的实现并不一定要使用它。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接