web-dev-qa-db-ja.com

intとしてstd :: vectorのサイズを取得するにはどうすればよいですか?

私は試した:

#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

どうすれば修正できますか?

32
Flashpaper

最初の2つのケースでは、実際にメンバー関数を呼び出すのを忘れていました(!、値ではありません)std::vector<int>::sizeこのように:

#include <vector>

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

3回目の電話

int size = v.size();

その関数のすべての戻り値(通常は64ビットの符号なしint)が32ビットの符号付きintとして表せるわけではないため、警告がトリガーされます。

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

常にきれいにコンパイルされ、std::vector::size_typeからintへの変換が意図されていることも明示的に示されます。

vectorのサイズがintが表すことができる最大数よりも大きい場合、sizeには実装定義(事実上のゴミ)値が含まれることに注意してください。

38
Baum mit Augen