繁体   English   中英

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

[英]Handling int and std::vector::size_type in comparsion

所以我有这样的东西(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())

由于与有符号和无符号 integer 类型进行比较,我收到警告。

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

谢谢你。

你的代码对我的口味来说有点太完美了。

分解它:

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_type 这个向量总是size_t因为它使用std::allocator 在代码审查中,为了便于阅读,我会要求将其更改为:

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

最后,您确实可以很好地比较它:

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

请注意,我提到了比较和演员表,因为这需要按此顺序进行。 最重要的是,当std::stoi失败时,您还需要一些异常处理,请参阅它的文档

有关如何正确处理已签名/未签名的更多详细信息,我可以在 itare 上推荐这篇文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM