比较处理 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())
{
// ...
}
}
请问从int
到std::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
失败时,您还需要一些异常处理,请参阅 it's documentation
关于如何正确处理signed/unsigned的更多详细信息,我可以在ithare上推荐this article。
所以我有这样的东西(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())
{
// ...
}
}
请问从int
到std::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
失败时,您还需要一些异常处理,请参阅 it's documentation
关于如何正确处理signed/unsigned的更多详细信息,我可以在ithare上推荐this article。