【问题标题】:why cannot push back address of element in vector<bool> to vector<bool*>?为什么不能将vector<bool>中元素的地址推回vector<bool*>?
【发布时间】:2015-09-07 09:26:27
【问题描述】:
#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

为什么?

【问题讨论】:

  • &amp;a[i] 给出错误“无法获取临时地址”。我不确定为什么你的编译器没有给出那个错误。
  • @0x499602D2:该错误消息看起来对应于push_back(a[i])(没有&amp;
  • @BenVoigt vector&lt;bool&gt;::operator[] 返回类类型的纯右值。 coliru.stacked-crooked.com/a/9302a6ba73fcef6c
  • @0x499602D2 我的意思是问题中的错误信息
  • @BenVoigt 对,他可能删除了&amp; 并复制粘贴了旧代码。

标签: c++ pointers vector boolean


【解决方案1】:

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

【讨论】:

  • 当然,他可以用vector&lt;bool&gt;::iterator代替bool*
猜你喜欢
  • 2015-11-05
  • 2012-01-14
  • 1970-01-01
  • 2013-07-21
相关资源
最近更新 更多