2015-06-22 50 views
1
#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; 
} 

,但它不能編譯,並說:爲什麼不能將向量<bool>中的元素地址推回到向量<bool*>?

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]); 

,但我不能相信它有邏輯錯誤的代碼,因爲我記得我能做到與詮釋一些類似的作品,所以我試圖將一些布爾整數:

#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 

爲什麼?

+0

'&a [i]'給出錯誤「不能取臨時地址」。我不確定你的編譯器爲什麼不給出這個錯誤。 – 0x499602D2

+0

@ 0x499602D2:該錯誤消息看起來像對應'push_back(a [i])'(沒有'&') –

+0

@BenVoigt'vector :: operator []'返回一個類類型的prvalue。 http://coliru.stacked-crooked.com/a/9302a6ba73fcef6c – 0x499602D2

回答

8

因爲vector<bool>是特殊的,並且可能比常規的布爾值更緊密地封裝比特。因此,您無法獲得正常的指針或引用其內部的布爾值。

+2

當然,他可以使用'vector :: iterator'而不是'bool *' –

相關問題