繁体   English   中英

迭代C ++中的for循环并将迭代器与负数进行比较。 int可以存储unsigned int吗?

[英]Iterating over a for loop in C++ and comparing the iterator to a negative number. Can an int store an unsigned int?

我想要:

  1. 存储默认索引值“-1”。 如果我完成遍历向量(使用for循环)并且索引值仍然是“-1”,我知道我的for循环检查的值都不匹配。
  2. 如果找到合适的值,则更新索引值以匹配迭代的向量中的值的索引。

例:

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的实现可以采取几种形式。

  1. 使用基于索引的for循环。
  2. 使用range- for循环。
  3. 使用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;
}

使用range- 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.

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