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

时间:2016-01-10 03:17:05

标签: 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 18446744073709551615
}

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

要避免这些问题,您可以添加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()

并获得有符号整数结果,并在从0减去1时获得n_items( v )

答案 2 :(得分:1)

输出会自动转换为size_t,因为这是value.size()的返回类型,即unsigned类型。因此,您会看到打印出unsigned值。

答案 3 :(得分:1)

.size()会返回一个&#39; size_t&#39;类型是unsigned int。第二个输出是机器的最大整数。

答案 4 :(得分:0)

value.size()返回一个无符号类型,因此通过执行-1实际上是在执行溢出