在 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”,我知道 none 我的 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++) 收到关于 "comparison between signed and unsigned integer expressions" 的警告。不幸的是,我不能只使用 unsigned integer index = -1,因为无符号整数不能存储负值。 unsigned int i 值存储在 int index 中是否安全,或者我是否需要寻找不同的比较方法? 在这种情况下,我会更改 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;
    }
}

您应该使用 size_t 寻址到 std::vectors。想一想有一天有人会向您的函数传递一个恰好包含 2^64 个条目的向量。

就个人而言,我发现布尔值更清晰,因为它使意图明确。

改用迭代器作为奖励,您根本不必编写循环:

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 );

你的第一种方法适用于小数字。

只需使用静态转换,直接告诉编译器你是故意这样做的

    index = static_cast<int>(i);

并在循环中使用 unsigned int

您可以使用特殊值:

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. 使用 index-based for 循环。
  2. 使用范围-for循环。
  3. 使用std::find.

None 其中要求您存储标记索引值。

使用index-basedfor循环

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;
}