为什么 C++ STL 在 size() 函数中使用 unsigned?
Why c++ STL uses unsigned in size() funtion?
我在使用这样的循环时遇到了问题,
//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
问题是 size() 方法使用了无符号数。因此,大小小于 2 的向量会产生未定义的结果。
我知道我应该为循环使用一个无符号变量,但它并没有解决问题。所以我不得不通过类型转换或使用一些条件来处理它。
我的问题是,为什么 STL 使用 unsigned int 来消除负索引访问冲突并产生更多问题?
原因是确定任何对象大小的运算符sizeof
return 是类型size_t
的值。例如,标准 C 函数 strlen
也有 return 类型 size_t
.
因此,采用标准容器也 return 将它们的大小作为 size_t
.
类型的值
至于循环则可以改写例如下面的方式
for ( size_t i = 0; i + 2 < sides.size(); i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
早在 90 年代就决定容器将使用无符号索引和大小。
从表面上看,这似乎是明智的;我的意思是,容器的大小和索引不能为负数。它还允许稍大的最大值,尤其是在 16 位系统上。
现在认为是一个错误;您的代码只是众多原因之一。 std2
几乎肯定会使用 ptrdiff_t
,size_t
的签约合作伙伴,用于大小和索引。
请注意,1u-2 是已定义的行为;它是 -1 转换为无符号的,保证是该类型的最大无符号值。
您可以通过多种方式修复代码,包括:
for (int i = 0; i+2 < sides.size(); i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
或
for (int i = 0; i < (std::ptrdiff_t)sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
第二个可以在接近内存大小 space 限制的容器上中断;在 64 位系统上,这不是问题,在 32 位系统和 char 向量上,您创建足够大的向量的可能性很小。
我在使用这样的循环时遇到了问题,
//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
问题是 size() 方法使用了无符号数。因此,大小小于 2 的向量会产生未定义的结果。
我知道我应该为循环使用一个无符号变量,但它并没有解决问题。所以我不得不通过类型转换或使用一些条件来处理它。
我的问题是,为什么 STL 使用 unsigned int 来消除负索引访问冲突并产生更多问题?
原因是确定任何对象大小的运算符sizeof
return 是类型size_t
的值。例如,标准 C 函数 strlen
也有 return 类型 size_t
.
因此,采用标准容器也 return 将它们的大小作为 size_t
.
至于循环则可以改写例如下面的方式
for ( size_t i = 0; i + 2 < sides.size(); i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
早在 90 年代就决定容器将使用无符号索引和大小。
从表面上看,这似乎是明智的;我的意思是,容器的大小和索引不能为负数。它还允许稍大的最大值,尤其是在 16 位系统上。
现在认为是一个错误;您的代码只是众多原因之一。 std2
几乎肯定会使用 ptrdiff_t
,size_t
的签约合作伙伴,用于大小和索引。
请注意,1u-2 是已定义的行为;它是 -1 转换为无符号的,保证是该类型的最大无符号值。
您可以通过多种方式修复代码,包括:
for (int i = 0; i+2 < sides.size(); i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
或
for (int i = 0; i < (std::ptrdiff_t)sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
第二个可以在接近内存大小 space 限制的容器上中断;在 64 位系统上,这不是问题,在 32 位系统和 char 向量上,您创建足够大的向量的可能性很小。