¿Cómo puedo obtener el tamaño de un std::vector como un int?

2 minutos de lectura

avatar de usuario
Papel rápido

Lo intenté:

#include <vector>

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

pero obtuve el 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'

Convirtiendo la expresión a int como esto:

#include <vector>

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

también arroja un 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 '()' ?)

Lo último que probé:

#include <vector>

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

que me dio:

warning: implicit conversion loses integer precision

¿Cómo puedo arreglar esto?

  • Puedes usar std::size(v); se introduce con c++17

    – anilbey

    17/07/2018 a las 20:05

  • @anilbey Probablemente te refieres std::ssize(v); que se introduce con C++20 porque std::size no soluciona el último problema.

    – LF

    12 de julio de 2019 a las 6:13

  • @LF, ¿podría explicar brevemente la diferencia entre esos dos?

    – anilbey

    14 de julio de 2019 a las 11:08

  • @anilbey std::size devuelve un entero sin signo, std::ssize devuelve un entero con signo. Excepto que acabo de darme cuenta de que ssize tampoco soluciona el problema…

    – LF

    14 de julio de 2019 a las 11:09

avatar de usuario
Baum mit Augen

En los dos primeros casos, simplemente se olvidó de llamar a la función miembro (!, no es un valor) std::vector<int>::size como esto:

#include <vector>

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

Tu tercera llamada

int size = v.size();

activa una advertencia, ya que no todos los valores de retorno de esa función (generalmente un int sin signo de 64 bits) se pueden representar como un int con signo de 32 bits.

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

siempre compilaría limpiamente y también declararía explícitamente que su conversión de std::vector::size_type a int se pretendía.

Tenga en cuenta que si el tamaño de la vector es mayor que el mayor número an int puede representar, size contendrá un valor definido por la implementación (basura de facto).

¿Ha sido útil esta solución?