【问题标题】:std::vector::size return an int type or unsigned intstd::vector::size 返回一个 int 类型或 unsigned int
【发布时间】:2018-06-28 08:46:51
【问题描述】:

在我使用std::vector 编写的大多数程序中,我的大部分痛苦都在转换

int offset=(int)v.size();
unsigned int offset=(unsigned int)v.size();

很遗憾这样的问题反映在this等很多其他问题上。

有什么方法可以重新连接std::vector 并强制它提供int 或unsigned int 之类的大小?

int offset=v.size_i();

类型转换使代码变得更加混乱。虽然,有些程序员很喜欢它们,并且觉得每次投射都没有问题。

c++14 解决方案更受欢迎,但c++17 解决方案也受到欢迎。

如果有人建议更改变量的类型,那么迟早会发生另一种类型转换。所以它并没有解决问题。

请考虑这些丑陋的短语

function((int)myvar1.vec[32].size(),(int)myvar2.vec[32].size());

其中function 只接受ints。而且我无法控制它的定义。

【问题讨论】:

  • 对auto 使用编译器类型推断?喜欢auto offset = v.size()?
  • @Someprogrammerdude,如果我需要 offset 成为 int,因为它被传递给另一个函数,最后应该发生另一个转换。
  • 你总是可以创建一个 ssize() 来为你做这件事。
  • 为什么不使用隐式转换?当弹出“比较签名和未签名”警告时,只需转换为signed/unsigned
  • myvar1.vec[32].size() 看起来已经很乱了,能不能把它封装成一个函数本身,给你想要的东西?

标签: c++ vector c++14


【解决方案1】:

您可以从std::vector 继承并重新实现size() 函数以返回有符号值:

template<typename T, typename Alloc = std::allocator<T> >
class my_vector : public std::vector<T, Alloc>
{
    using base_t = std::vector<T,Alloc>;
public:
    using base_t::vector;
    using base_t::operator =;

    int size() const noexcept { return base_t::size(); }
};

【讨论】:

  • noexcept 重要吗?
  • 应该推荐给c++20。
  • @ar2015,如果你问我,我相信std::vector::size 应该返回无符号,因为大小不能为负数。 noexcept 在这里并不重要,主要是为了 api 的一致性。但它可能在某些可能的情况下有用
  • @ar2015 请记住,std::vector 没有 virtual 析构函数。它不是为(公共)继承而设计的。
  • @ar2015 考虑submitting a proposal
【解决方案2】:

std::vector&lt;&gt;.size() 将变为 unsigned。这是类的连接方式,它甚至包括一个typedef 用于该类型,即std::vector&lt;&gt;::size_type。你最好养成使用unsigned 偏移量的习惯。

【讨论】:

  • 如果类型转换由库执行不是比用户每次都更好吗?
  • @ar2015 如果库清楚返回类型就更好了,向量的大小永远不会是负数,所以无符号类型是更好的选择
  • 我的大多数应用程序都不需要你的变量很大。此外,该大小还用于许多计算,其中最终结果可能为负数,您需要键入 cast 是用 int 变量添加/减去它。假设 (-Wconversion) 已开启。
  • @ar2015 如果只是在大多数应用程序中你不需要它们变大,那么你做的那些呢?
【解决方案3】:

在 c++20 中,您可以使用std::ssize,它返回一个有符号整数。

将其用作:

std::ssize(my_std_vector)

或:

my_std_vector.ssize()

将其引入标准库的提案是P1227R1。

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多