web-dev-qa-db-fra.com

Comment puis-je obtenir la taille d'un std :: vector en tant que int?

J'ai essayé:

#include <vector>

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

mais j'ai eu l'erreur:

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'

Transformer l'expression en int comme ceci:

#include <vector>

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

génère également une erreur:

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 '()' ?)

Dernière j'ai essayé:

#include <vector>

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

qui m'a donné:

warning: implicit conversion loses integer precision

Comment puis-je réparer cela?

32
Flashpaper

Dans les deux premiers cas, vous avez simplement oublié d'appeler réellement la fonction membre (!, Ce n'est pas une valeur) std::vector<int>::size comme ça:

#include <vector>

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

Votre troisième appel

int size = v.size();

déclenche un avertissement, car toutes les valeurs renvoyées par cette fonction (généralement un entier non signé de 64 bits) ne peuvent être représentées par un entier signé de 32 bits.

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

toujours compiler proprement et explicitement que votre conversion de std::vector::size_type à int était prévu.

Notez que si la taille de vector est supérieure au plus grand nombre que peut représenter int, size contiendra une valeur définie par l'implémentation (ordures de facto).

38
Baum mit Augen