向量大小 - 在 C++ 中大小为 0 时为 1

vector size - 1 when size is 0 in C++

下面的代码

#include <vector>
#include <iostream>
using namespace std;
int main() {
    vector<int> value;
    cout << value.size() << endl;  // output 0
    cout << value.size() - 1 << endl;  // output 18446744073709551615
}

为什么第二个输出不是-1?第二场会发生什么?

vector::size()size_t类型,是无符号类型,无符号整数不能表示负数。

value.size() returns 一个无符号类型,所以通过 -1 你实际上是在溢出

输出自动转换为 size_t,因为这是 value.size() 的 return 类型,后者是 unsigned 类型。因此,您会看到打印了一个 unsigned 值。

.size() returns 一个 'size_t' 类型,它是一个 unsigned int。第二个输出是你机器的最大整数。

C++ 中的无符号整数类型执行“环绕运算”a.k.a。时钟算法 a.k.a。模运算。并且任何标准库 size 函数的结果都是无符号的,通常是类型 size_t。因此,当您从 size_t 类型的 0 中减去 1 时,您会得到最大的 size_t 值。

要避免这些问题,您可以包含 <stddef.h> 并定义

using Size = ptrdiff_t;

还有(这里的第二个函数需要包含<bitset),

template< class Type >
auto n_items( Type const& o )
    -> Size
{ return o.size(); }

template< Size n >
auto n_items( std::bitset<n> const& o )
    -> Size
{ return o.count(); }       // Corresponds to std::set<int>::size()

那你就可以写

n_items( v )

得到一个有符号整数结果,-1当你从 0 中减去 1。