How can I get the size of an std::vector as an int

2020-05-19 21:13发布

I tried:

#include <vector>

int main () {
    std::vector<int> v;
    int size = v.size;
}

but got the error:

cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'

Casting the expression to int like this:

#include <vector>

int main () {
    std::vector<int> v;
    int size = (int)v.size;
}

also yields an error:

error: invalid use of member function 'std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '()' ?)

Last I tried:

#include <vector>

int main () {
    std::vector<int> v;
    int size = v.size();
}

which gave me:

warning: implicit conversion loses integer precision

How can I fix this?

1条回答
SAY GOODBYE
2楼-- · 2020-05-19 21:24

In the first two cases, you simply forgot to actually call the member function (!, it's not a value) std::vector<int>::size like this:

#include <vector>

int main () {
    std::vector<int> v;
    auto size = v.size();
}

Your third call

int size = v.size();

triggers a warning, as not every return value of that function (usually a 64 bit unsigned int) can be represented as a 32 bit signed int.

int size = static_cast<int>(v.size());

would always compile cleanly and also explicitly states that your conversion from std::vector::size_type to int was intended.

Note that if the size of the vector is greater than the biggest number an int can represent, size will contain an implementation defined (de facto garbage) value.

查看更多
登录 后发表回答