std::size_t 或 std::vector<Foo>::size_type?
std::size_t or std::vector<Foo>::size_type?
当我在 std::vector<Foo>
(或每个具有随机访问迭代器的容器)上循环时,我使用无符号整数变量 i
。如果我想尊重规范,我应该使用 std::size_t
还是容器本身给定的类型: std::vector<Foo>::size_type
?
如果我选择 std::size_t
(出于可读性原因),我可以确定 std
命名空间中每个容器的每个实现都使用 std::size_t
作为 size_type
吗?
注意:我只使用 C++98(出于兼容性原因)。
不一定正确 std::vector<Foo>::size_type
与 std::size_t
相同。即使对于 C++11 也是如此。
但我个人使用 std::size_t
作为 std::vector
索引,而不考虑类型。
如果您感觉特别勤奋,您总是可以使用静态断言。显然 static_assert
是后来在 C++98 中添加的内容,但在该标准中你可以使用类似
的内容
static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector<Foo>::size_type)];
static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector<Foo>::size_type)];
如果类型类型大小不同,这将导致编译时失败。
can I be sure that every implementation of every container in std namespace uses std::size_t
as size_type
?
不,你不能。但是在实践中,您可以相信 std::size_t
对于向量或任何其他基于单个数组的容器来说足够大,因为
size_t
can store the maximum size of a theoretically possible object of any type (including array).
当我在 std::vector<Foo>
(或每个具有随机访问迭代器的容器)上循环时,我使用无符号整数变量 i
。如果我想尊重规范,我应该使用 std::size_t
还是容器本身给定的类型: std::vector<Foo>::size_type
?
如果我选择 std::size_t
(出于可读性原因),我可以确定 std
命名空间中每个容器的每个实现都使用 std::size_t
作为 size_type
吗?
注意:我只使用 C++98(出于兼容性原因)。
不一定正确 std::vector<Foo>::size_type
与 std::size_t
相同。即使对于 C++11 也是如此。
但我个人使用 std::size_t
作为 std::vector
索引,而不考虑类型。
如果您感觉特别勤奋,您总是可以使用静态断言。显然 static_assert
是后来在 C++98 中添加的内容,但在该标准中你可以使用类似
static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector<Foo>::size_type)];
static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector<Foo>::size_type)];
如果类型类型大小不同,这将导致编译时失败。
can I be sure that every implementation of every container in std namespace uses
std::size_t
assize_type
?
不,你不能。但是在实践中,您可以相信 std::size_t
对于向量或任何其他基于单个数组的容器来说足够大,因为
size_t
can store the maximum size of a theoretically possible object of any type (including array).