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(){
向量值;
coutvector::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 )