在比较中处理int和std :: vector :: size_type

时间:2019-11-10 18:41:24

标签: c++ int c++03 size-type

所以我有这样的东西(C ++ 03):

class MyClass
{
    // ...
}

class something
{
    private:
        std::vector<MyClass*> container;
    // ...
}

// cmdarg can be anything, negative int too...
void something::foo(const std::string& cmdarg)
{
    const int res = std::stoi(cmdarg);
    if (res >= 0 && static_cast<std::vector<MyClass*>::size_type>(res) < this->container.size())
    {
        // ...
    }
}

我想问一下从intstd::vector<MyClass*>::size_type的转换是否有效。 res >= 0说它不是负数,所以我想转换为另一个非负数是可以的。

我的问题是,如果我写

if (res >= 0 && res < container.size())

由于有符号和无符号整数类型的比较,我得到警告。

我上面的代码(完整的代码)可以编译并且可以正常工作,但是我不确定。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码对于我的口味来说似乎太完美了。

打破现状:

const int res = std::stoi(cmdarg);
if (res >= 0 && static_cast<std::vector<MyClass*>::size_type>(res) < this->container.size())

用于检查零以下的if语句很好。我个人将其写为:

if (res < 0)
{
    std::cerr << "Negative number " << res <<" given for ..., a positive was expected" << std::endl;
    return -1;
}

这导致我们进入演员表:

auto unsigned_res = static_cast<std::vector<MyClass*>::size_type>(res);

但是,由于向量使用size_t,因此大小始终为std::allocator。在代码审查中,我请求将其更改为可读性:

auto unsigned_res = static_cast<std::size_t>(res);

最后,您确实可以对它进行比较:

if (unsiged_res < container.size())
    // Do something

请注意,我同时提到了比较和强制类型转换,因为这需要按此顺序进行。最重要的是,当std::stoi失败时,您还需要一些异常处理,请参见it's documentation

有关如何正确处理已签名/未签名的更多详细信息,我可以在ithare上推荐this article