[英]Iterating over a for loop in C++ and comparing the iterator to a negative number. Can an int store an unsigned int?
我想要:
例:
int index = -1;
for (int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
但是,我总是从for (int i; i < vector.size(); i++)
得到关于“有符号和无符号整数表达式之间的比较”的警告。 不幸的是,我不能只使用unsigned integer index = -1
,因为无符号整数不能存储负值。 在int index
存储unsigned int i
值是否安全,或者我是否需要找到不同的比较方法? 在这种情况下,我会将for循环更改为for (unsigned int i; i < vector.size(); i++)
,但保留其余代码相同。
我可以使用一个单独的布尔变量,但每次遇到这种情况时,使用额外变量似乎更混乱。 它看起来像这样:
bool found = false;
unsigned int index = -1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
bool = true;
break;
}
}
使用迭代器而作为奖励你根本不需要写一个循环:
auto it = std::find( vector.begin(), vector.end(), 1 );
if( it == vector.end() ) {
... // not found
}
如果您愿意,可以使用带有显式循环的迭代器。
auto it = vector.begin();
for( ; it != vector.end(); ++it ) {
if( *it == 1 ) break;
}
if( it == vector.end() ) {
... // not found
}
auto index = std::distance( vector.begin(), it );
您可以使用特殊值:
unsigned int index = (unsigned int)-1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
编译器将(unsigned int)-1
为适合unsigned int的最大值,对于32位表示,该值为4,294,967,295
我建议添加一个功能:
bool contains(std::vector<int> const& vec, int item);
然后,客户端代码可以简化为:
if ( contains(vector, 1) )
{
...
}
else
{
...
}
contains
的实现可以采取几种形式。
for
循环。 for
循环。 std::find
。 它们都不要求您存储标记索引值。
for
循环 bool contains(std::vector<int> const& vector, int item)
{
for (size_t i = 0; i < vector.size(), ++i )
{
if ( vector[i] == item )
{
return true;
}
}
return false;
}
for
循环 bool contains(std::vector<int> const& vector, int item)
{
for (auto x : vector)
{
if ( x == item )
{
return true;
}
}
return false;
}
std::find
bool contains(std::vector<int> const& vector, int item)
{
return (std::find(vector.begin(), vector.end(), item) != vector.end());
}
您可以在size_t
操作,无需切换到int
。 这样可以保证您的索引与矢量的大小兼容。 此外,如果你仍想比较-1,你可以。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 0,2,3,4 };
size_t index = -1;
for (size_t i = 0, n = v.size(); i < n; ++i)
{
if (v[i] == 1)
{
index = i;
break;
}
}
if (static_cast<int>(index) == -1)
{
std::cout << "not found" << std::endl;
}
else
std::cout << index << std::endl;
}
你应该使用size_t
来寻址到std::vector
s。 想想有人会将具有2 ^ 64个条目的向量传递给您的函数的那一天。
Personnaly,我发现boolean更清晰,因为它使intent明确。
对于小数字,你的第一种方法是可以的。
只需使用静态强制转换,直接向编译器说你正在故意这样做
index = static_cast<int>(i);
并在循环中使用unsigned int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.