如何将std::vector的大小作为int获取?

54

我尝试过:

#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

我该如何修复这个问题?


2
你可以使用 std::size(v);,它是在c++17中引入的。 - anilbey
@anilbey 你可能指的是 std::ssize(v);,它是在 C++20 中引入的,因为 std::size 没有解决最后一个问题。 - L. F.
@L.F. 你能简要解释一下这两者之间的区别吗? - anilbey
@anilbey std::size 返回一个无符号整数,std::ssize 返回一个有符号整数。但我刚注意到 ssize 也无法解决这个问题... - L. F.
2个回答

77
在前两种情况下,您只是忘记实际调用成员函数(!它不是一个值)std::vector<int>::size,像这样:
#include <vector>

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

您的第三个调用

int size = v.size();

这会触发一条警告,因为并不是那个函数的每个返回值(通常为64位无符号整数)都能表示为32位有符号整数。

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

代码应该始终能够干净编译,并明确说明你从std :: vector :: size_type转换为int是有意的。

请注意,如果 vector 的大小大于 int 可以表示的最大数字,则 size 将包含实现定义(事实上是垃圾)值。


0

很简单 :) 使用以下代码替换您的代码。

auto size = v.size();

您的答案可以通过添加额外的支持信息进行改进。请[编辑]以添加更多详细信息,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接