将 Vector 的长度与负数进行比较时,For 循环不会运行C++

  • 本文关键字:For 循环 C++ 运行 比较 Vector c++
  • 更新时间 :
  • 英文 :


我有一对嵌套的for循环,我正试图打印以下结构:

0 1 2 3 4 
0 - - - - - 
1 - - - - - 
2 - - - - - 
3 - - - - - 
4 - - - - - 

如果我尝试将外循环的行计数器初始化为-1,并使用.length()将其与向量的长度进行比较,则外循环根本不会运行。我已经通过将print语句放在外循环中进行了测试,它们永远不会被执行。我的编译器还会发出以下警告:warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::vector<char> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]我试图将行计数器从int更改为长无符号int,虽然这会抑制警告消息,但循环仍然不会运行。这种行为的原因是什么?我该如何解决?

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void print_board(vector<vector<char>> board)
{
int row, col;
cout << "  ";
for (row = -1; row < board.size(); row++)
{
if (row > -1)
cout << row << " ";
for (col = 0; col < board[row].size(); col++)
{
if (row == -1)
cout << col << " "; 
else
cout << board[row][col] << " ";
}
cout << endl;
}
}
int main()
{
int max_rows = 5;
vector<vector<char>> player_one_board(max_rows, vector<char>(max_rows, '-'));
print_board(player_one_board);
return 0;
}

如果你所做的只是打印出电路板,那么你真的不应该从-1开始,而是从0开始。即:

std::cout << "  ";
for (std::size_t col = 0; col < board[0].size(); ++col) {
std::cout << col << " ";
}
std::cout << std::endl;
for (std::size_t row = 0; row < board.size(); ++row) {
std::cout << row << " ";
for (std::size_t col = 0; col < board[row].size(); ++ col) {
std::cout << board[row][col] << " ";
}
std::cout << endl;
}

Vector不能包含少于0个元素。使用0初始化行,或者如果行小于0,则使用continue跳过列的循环。

警告基本上告诉了一切:board.size()是无符号的,所以应该是row。当您按下警告时,现在的问题不是比较,而是如何用-1初始化row。它真的不应该是,因为它是无符号的,它不能容纳-1。相反,它会悄悄地用一些正数初始化。在这一点上,没有得到另一个警告或错误实际上是C++的错。由于C的遗留问题,它的类型系统有点弱。

这里的解决方案是保持row无符号,并以不同的方式表达您的逻辑,而不使用-1

最新更新