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

问题描述 投票:0回答:5

以下代码

#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?第二场会发生什么?

c++ vector size
5个回答
9
投票

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


2
投票

C++ 中的无符号整数类型执行“环绕算术”,也就是时钟算术,也就是模算术。并且任何标准库

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.


1
投票

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


1
投票

输出会自动转换为

size_t
,因为这是
value.size()
的返回类型,这是一个
unsigned
类型。因此,您会看到打印了一个
unsigned
值。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.