Как я могу получить размер std :: vector как int?

Я пытался:

#include <vector>

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

но получил ошибку:

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'

Выделение выражения для int следующим образом:

#include <vector>

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

также дает ошибку:

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

Последнее, что я пробовал:

#include <vector>

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

который дал мне:

warning: implicit conversion loses integer precision

Как я могу это исправить?

Ответы

Ответ 1

В первых двух случаях вы просто забыли на самом деле вызвать функцию-член (!, It not a value) std::vector<int>::size:

#include <vector>

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

Ваш третий звонок

int size = v.size();

запускает предупреждение, так как не каждое возвращаемое значение этой функции (обычно 64-битное беззнаковое int) может быть представлено как 32-битный подписанный int.

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

всегда будет компилироваться чисто и также явно заявляет, что ваше преобразование из std::vector::size_type в int было предназначено.

Обратите внимание: если размер vector больше, чем наибольшее число, которое может представлять int, size будет содержать значение, определенное реализацией (de facto garbage).