索引 std::vector<bool> 适用于真值,但不适用于假值

问题描述

我想用 C++ 运行一个简单的程序,其中有两个向量 - 一个std::vector<int>,另一个是等长的 std::vector<bool>。索引处布尔向量的值决定是否打印整数向量的值。这是我尝试运行的程序的副本:

#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<int> arr{1,2,3,4,5};
    vector<bool> b(true,arr.size());

    for(int i=0; i<arr.size(); i++){
        if(b[i])
            cout<<arr[i]<<endl;
    }
    return 0;
}

上述程序按预期运行。但是当我将 std::vector 初始化行中的值从 true 更改为 false 时遇到地址边界错误。准确地说,错误是:

fish: Job 1,'./test_vector_bool' terminated by signal SIGSEGV (Address boundary error)

我已经从这些线程中了解到使用 vector<bool> 的一些主要陷阱:

我从这些线程中收集到的是,我们不应该在 cpp 中使用 vector<bool> 的引用。但我需要知道的是,为什么带有 true 的向量工作和带有 false 的初始化失败?

解决方法

vector<bool> b(true,arr.size()); 将创建一个向量,具有 1 元素,值为 arr.size()。因此,循环将越界。

重要的是要记住,当我们以这种方式构建容器时,我们会说:“What much of what”

在这种情况下:“我们需要 arr.size() 元素的值为 true

vector<bool> b(arr.size(),true);

有关更多信息,您可能需要查看向量构造函数上的 documentation,特别是第三个,“填充构造函数”。