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

Flashpaper picture Flashpaper · Jul 3, 2015 · Viewed 103k times · Source

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?

Answer

Baum mit Augen picture Baum mit Augen · Jul 3, 2015

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.