int 和布尔值之间的不一致

Inconsistency between int and bool

本文关键字:不一致 之间 布尔值 int      更新时间:2023-10-16

我只是在 c++ 中实现了广度优先搜索,而不是将向量声明为 bool ,而是将其声明为 int 。这导致了一个非常奇怪的观察。当我使用 int 时,代码打印了以下内容:

1
32763
-524268732

在整个代码中,我没有为变量提供任何这样的值,因为第二个和第 3 个节点接收,所以我假设它们只是垃圾值,但是当我初始化向量时,为什么垃圾值甚至会出现,当我初始化向量以充满零时???您可以检查代码如下:

#include <iostream>
#include <queue>
using namespace std;
queue<int> neigh;
vector< vector<int> > graph(3);
vector<int> flag(3, 0);
int main(void)
{
    graph[0].push_back(1); graph[0].push_back(2);
    graph[1].push_back(0); graph[1].push_back(2);
    graph[2].push_back(0); graph[3].push_back(1);
    neigh.push(0);
    while(!neigh.empty())
    {
        int cur = neigh.front();
        neigh.pop();
        flag[cur] = 1;
        for(int i = 0, l = graph[cur].size();i < l;i++)
        {
            if(!flag[graph[cur][i]])
                neigh.push(graph[cur][i]);
        }
    }
    for(int i = 0;i < 3;i++)
    {
        cout << flag[i] << endl;
    }
}

好的,然后我只更改了一行代码,第 7 行,即我声明和初始化 flag 向量的代码。

以前:

vector<int> flag(3, 0);

后:

vector<bool> flag(3, false);

瞧!代码开始工作:

1 //The new output
1
1

所以,我的问题是,代码首先有什么问题?我相信这可能是我犯的某种错误,或者我的 bfs 实现完全有效只是偶然的......那么,真相是什么,所以?我的(可能的)错误是什么?

您在此处越界访问向量:

graph[3].push_back(1);

此时此刻,graph只有三个要素。这会导致未定义的行为