C++ 向量大小-1,当C+中的大小为0时+;

C++ 向量大小-1,当C+中的大小为0时+;,c++,vector,size,C++,Vector,Size,下面的代码 #include <vector> #include <iostream> using namespace std; int main() { vector<int> value; cout << value.size() << endl; // output 0 cout << value.size() - 1 << endl; // output 18446744073

下面的代码

#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
}
#包括
#包括
使用名称空间std;
int main(){
向量值;

cout
vector::size()
属于类型
size\u t
,它是一种无符号类型,无符号整数不能表示负数。

value.size()返回一个无符号类型,因此通过执行-1,实际上是在执行溢出操作,输出将自动转换为
size\u t
,因为这是
value.size()
的返回类型,它是一个
无符号的
类型。因此,您会看到打印的
无符号的
值。

The.size()返回一个“sisixt”类型,它是一个未签名的int。第二个输出是您机器的最大整数。C++中的

< p>无符号整数类型做“环绕算术”。a.k.a.时钟算法a.k.a.模运算。任何标准库
size
函数的结果都是无符号的,通常是类型
size\u t
。因此,当你从类型
size\u t
的0中减去1时,你会得到最大的
size\u t

为了避免这些问题,您可以包括
并定义

using Size = ptrdiff_t;

此外(这里的第二个函数需要包含
Simple:Overflow(underflow)…因为它是一个未签名的值。Google food for you:2的补码。这里没有2的补码问题。链接到相关问题/答案:
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 )