2015-12-04 10 views
30

क्यों इस कोड कामरेंज के लिए लूप और std :: वेक्टर <bool>

std::vector<int> intVector(10); 
for(auto& i : intVector) 
    std::cout << i; 

और यह नहीं है करता है?

std::vector<bool> boolVector(10); 
for(auto& i : boolVector) 
    std::cout << i; 

उत्तरार्द्ध मामले में, मैं एक त्रुटि

error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’

for(auto& i : boolVector) 
+0

संभावित डुप्लिकेट [सी ++ 11 की श्रेणी-आधारित का उपयोग करने का सही तरीका क्या है?] (Http://stackoverflow.com/q/15927033/3425536) ("वेक्टर " के लिए खोजें) – emlai

उत्तर

25

क्योंकि std::vector<bool> is not a container!

std::vector<T> के इटरेटर आमतौर पर T& पर निर्भर करते हैं, जिसे आप अपने auto& से जोड़ सकते हैं।

std::vector<bool>, हालांकि, इसके bool एस को पूर्णांक के अंदर पैक करता है, इसलिए उन्हें एक्सेस करते समय बिट-मास्किंग करने के लिए आपको प्रॉक्सी की आवश्यकता होती है। इस प्रकार, इसके iterators Proxy लौटते हैं।
और लौटाए गए Proxy एक प्रावधान (अस्थायी) है, यह auto& जैसे किसी Lvalue संदर्भ से जुड़ नहीं सकता है।

समाधान: auto&& का उपयोग करें, जो एक दिया गया है, या अगर एक प्रॉक्सी दिया गया है तो अस्थायी जीवित बाध्य और बनाए रखने के लिए सही ढंग से एक lvalue संदर्भ में पतन होगा।

+4

प्रॉक्सी वास्तव में एक प्रवाल है। –

+3

सी ++ 17 समाधान (उम्मीद है): बस [i: boolVector) '] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3853.htm का उपयोग करें) – jingyu9575

+5

@ jingyu9575 [वह प्रस्ताव अस्वीकार कर दिया गया था] (http://stackoverflow.com/a/32706369/1708801) हालांकि जीसीसी ने थोड़ी देर के लिए उस सुविधा का समर्थन किया था। –

6

vector<bool> is (usually) specialized explicitly to store each bool in a single bit मिलता है, आठ मूल्यों के अनुसार एक बाइट के लिए मूल्य प्रति एक बाइट से भंडारण लागत को कम करने। ऑफशैंड के बारे में मुझे कोई प्रोसेसर पता नहीं है, इसलिए vector<bool> में मानों का संदर्भ संग्रहीत करना असंभव है। पुनरावृत्ति मान i के लिए आपको सादे auto, auto& का उपयोग करने की आवश्यकता नहीं है।

7

std::vector<bool> मानक कंटेनर नियमों का पालन नहीं करता है।

विशेष रूप से, operator[]bool& वापस नहीं आता है।

अमान्य कोड

#include <vector> 
#include <iostream> 

int main() { 
    std::vector<bool> boolVector(10); 
    for (auto& i: boolVector) 
     std::cout << i; 
} 

में पाश मूल्यों के माध्यम से पुनरावृति करने के तीन तरीके से किसी में लिखा जा सकता है:

  1. (-केवल पढ़ने के लिए)

  2. (केवल पढ़ने योग्य, संभवतः अक्षम)

    for (auto const& i: boolVector) 
        std::cout << i; 
    
  3. (पठन/लेखन)

    for (auto&& i: boolVector) 
        std::cout << i; 
    

पहली और आखिरी के बीच विकल्प है कि क्या आप वेक्टर में मूल्यों को संशोधित करने के सिर्फ उन्हें पढ़ने की जरूरत है, या करने के लिए नीचे है।

संबंधित मुद्दे