2015-06-03 4 views
7

vector<int> someVector के साथ एक उदाहरण में और istringstream someStringStream आप यह कर सकते हैं:वेक्टर <bool> के साथ निष्कर्षण ऑपरेटर (>>) का उपयोग कैसे करते हैं?

for (int i=0; i < someVector.size(); i++) { 
    someStringStream >> someVector[i]; 
} 

मुझे पता है कि vector<bool> एक कुशल कार्यान्वयन है, और operator[] एक संदर्भ वस्तु देता है। इस कोड के लिए मुझे अधिकतर पठनीयता के लिए एक इटरेटर की बजाय इंडेक्स का उपयोग करना चाहिए। वर्तमान में, मैं इस का उपयोग कर रहा:

for (int i=0; i < someVector.size(); i++) { 
    bool temp; 
    someStringStream >> temp; 
    someVector[i] = temp; 
} 

इस को लागू करने का एक और अधिक प्रत्यक्ष रास्ता नहीं है?

उत्तर

0

यदि आप चाहते हैं कि बूल और अन्य प्रकार के लिए एक ही इंटरफ़ेस है, तो चीजों को लपेटना आसान है।

template <typename T> 
T read(std::istream& stream) 
{ 
    T value; 
    stream >> value; // TODO: guard against failure of extraction, e.g. throw an exception. 
    return value; 
} 

हालांकि, इसका उपयोग करने के लिए आपको सीधे एक प्रकार निर्दिष्ट करने की आवश्यकता होती है।

for (int i=0; i < someIntVector.size(); i++) 
{ 
    someIntVector[i] = read<int>(someStringStream); 
} 

for (int i=0; i < someBoolVector.size(); i++) 
{ 
    someBoolVector[i] = read<bool>(someStringStream); 
} 

आप कई अलग अलग वैक्टर के लिए पुनः उपयोग करते हैं कि, बस इसे फिर से लपेट:

template <typename T, typename A> 
void fillVectorFromStream(std::istream& stream, std::vector<T, A>& vector) 
{ 
    for (int i = 0; i < vector.size(); ++i) 
    { 
     vector[i] = read<T>(stream); 
    } 
} 

इसलिए, उपयोग बस

fillVectorFromStream(streamOfBool, vectorOfBooleanValues); 
fillVectorFromStream(streamOfIntegers, vectorOfIntegers); 
+0

यह सुरक्षित नहीं है। यदि ऑपरेटर >> विफल रहता है, तो "मान" को प्रारंभ नहीं किया जाएगा। या तो स्ट्रीम स्टेटस को स्पष्ट रूप से चेक किया जाना चाहिए, या std :: ios_base :: विफलता को स्ट्रीम के अपवादों() में ऑर्डर किया जाना चाहिए। –

+1

@ArneVogel यह C++ 11 में बदल गया है: यदि निष्कर्षण विफल रहता है, शून्य मान पर लिखा जाता है (http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt देखें)। हालांकि, मैं सहमत हूं कि उत्पादन कोड में त्रुटि जांच आवश्यक है। फिर भी, ऐसा करने के कई तरीके हैं। यह एक चुनने के लिए सवाल का दायरा नहीं है, इमो। – stefan

5

आप std::copy इस्तेमाल कर सकते हैं या std::vector रेंज निर्माता अगर हो जाता है आप पूरी धारा का उपभोग करना चाहते हैं:

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec; 
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec)); 

LIVE DEMO

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec(std::istream_iterator<bool>(ss), {}); 

LIVE DEMO

अब उदाहरण है कि आप पोस्ट देख रही है और यदि आप सुनिश्चित करें कि आपके std::vector आकार उचित है आप नीचे दिए गए उदाहरण की तरह std::generate इस्तेमाल कर सकते हैं कर रहे हैं:

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec(4); 
std::generate(std::begin(vec), std::end(vec), [&ss](){ bool val; ss >> val; return val;}); 

LIVE DEMO

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