在comparison中处理int和std::vector::size_type

Handling int and std::vector::size_type in comparsion

本文关键字:vector size type std comparison 处理 int      更新时间:2023-10-16

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

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

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

谢谢。

您的代码看起来有点太完美了。

分解:

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失败时,您还需要一些异常处理,请参阅文档

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