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

时间:2015-06-22 02:15:52

标签: c++ pointers vector boolean

#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("%d\n",*(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转换为整数:

#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("%d\n",*(aa[i]));
    }
    return 0;
}

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

0
0
1
1
1

为什么?

1 个答案:

答案 0 :(得分:8)

因为vector<bool>是特殊的,并且可能比普通的布尔数组更紧密地打包。因此,您无法获得正常的指针或对其中布尔值的引用。