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

2

55

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?

Derivation answered 2/7, 2015 at 23:53 Comment(4)
You can use std::size(v); it is introduced with c++17Repeat
@Repeat You probably mean std::ssize(v); that is introduced with C++20 because std::size doesn't fix the last problem.Camber
@L.F. could you briefly explain the difference between those two?Repeat
@Repeat std::size returns an unsigned integer, std::ssize returns a signed integer. Except I just noticed that ssize doesn't solve the problem either ...Camber
R
80

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.

Rappee answered 2/7, 2015 at 23:58 Comment(0)
M
0

Easy :) Use the following code instead of your code.

auto size = v.size();
Mayoralty answered 21/4, 2023 at 8:52 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Osseous

© 2022 - 2024 — McMap. All rights reserved.