为什么不能将矢量中元素的地址推回<bool>矢量<bool*>?

why cannot push back address of element in vector<bool> to vector<bool*>?

本文关键字:bool lt gt 矢量 不能 地址 元素 为什么      更新时间:2023-10-16
#include <sstream>
#include <vector>
using namespace std;
bool myfunc(bool* i,bool* j){
    return *i<*j;
}
int main(){
    vector<bool> a;
    a.push_back(true);
    a.push_back(false);
    a.push_back(false);
    a.push_back(true);
    a.push_back(true);
    vector<bool*> aa;
    for(int i=0;i<a.size();i++){
        aa.push_back(&a[i]);
    }
    sort(aa.begin(),aa.end(),myfunc);
    for(int i=0;i<aa.size();i++){
        printf("%dn",*(aa[i]));
    }
    return 0;
}

但它不能编译并说:

no viable conversion from '__bit_iterator<std::__1::vector<bool, std::__1::allocator<bool> >, false>' to 'const value_type' (aka 'bool *const')
    aa.push_back(&a[i]);

但我不敢相信它有错误的逻辑代码,因为我记得我可以用int做一些类似的工作,所以我尝试将一些bool转换为integer:

#include <sstream>
#include <vector>
using namespace std;
int myfunc(int* i,int* j){
    return *i<*j;
}
int main(){
    vector<int> a;
    a.push_back(true);
    a.push_back(false);
    a.push_back(false);
    a.push_back(true);
    a.push_back(true);
    vector<int*> aa;
    for(int i=0;i<a.size();i++){
        aa.push_back(&a[i]);
    }
    sort(aa.begin(),aa.end(),myfunc);
    for(int i=0;i<aa.size();i++){
        printf("%dn",*(aa[i]));
    }
    return 0;
}

但这次它可以编译并运行:

0
0
1
1
1

为什么?

因为向量<bool>是特殊的,并且可能比布尔值的常规数组更紧密地封装位。因此,您无法获得一个普通指针或对其内部布尔值的引用。