为什么C ++ STL使用unsigned in size()函数?

Ult*_*let 1 c++ size containers stl sizeof

我在使用这样的循环时遇到了一个问题,

//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
  if (sides[i] < sides[i+1] + sides[i+2]) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是size()方法使用无符号数字。因此,大小小于2的向量会产生不确定的结果。

我知道我应该为循环使用一个无符号变量,但是它不能解决问题。所以我不得不通过类型转换或使用某些条件来处理它。

我的问题是,为什么STL为什么使用unsigned int来消除否定索引访问冲突并产生更多问题?

Yak*_*ont 5

决定容器在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]) {
Run Code Online (Sandbox Code Playgroud)

要么

for (int i = 0; i < (std::ptrdiff_t)sides.size()-2; i++) {
  if (sides[i] < sides[i+1] + sides[i+2]) {
Run Code Online (Sandbox Code Playgroud)

第二个可能会破坏接近您的内存空间限制大小的容器;在64位系统上,这不是问题,在32位系统和char向量上,您几乎不可能创建足够大的向量。