向量大小 - 在 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。
下面的代码
#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。