अपने प्रश्न का उत्तर देने के लिए, आप एक पुनरावृत्ति का उपयोग कर सकते हैं:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
यदि आप लूप के लिए वेक्टर की सामग्री को संशोधित करना चाहते हैं, तो iteratorइसके बजाय का उपयोग करें const_iterator।
लेकिन इसके बारे में बहुत कुछ कहा जा सकता है। यदि आप केवल एक उत्तर चाहते हैं जिसका आप उपयोग कर सकते हैं, तो आप यहां रुक सकते हैं; अन्यथा, पर पढ़ें।
ऑटो (C ++ 11) / टाइपडिफ
यह एक और समाधान नहीं है, लेकिन उपरोक्त iteratorसमाधान का पूरक है । यदि आप C ++ 11 मानक (या बाद में) का उपयोग कर रहे हैं, तो आप autoपठनीयता में मदद करने के लिए कीवर्ड का उपयोग कर सकते हैं :
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
लेकिन iगैर-कॉन्स्टेंट का प्रकार (यानी, संकलक std::vector<char>::iteratorके प्रकार के रूप में उपयोग करेगा i)।
इस स्थिति में, आप केवल एक का उपयोग कर सकते हैं typedef(C ++ 11 तक सीमित नहीं है, और वैसे भी उपयोग करने के लिए बहुत उपयोगी है):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
काउंटर
आप निश्चित रूप से, forलूप में अपनी स्थिति दर्ज करने के लिए पूर्णांक प्रकार का उपयोग कर सकते हैं :
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
यदि आप ऐसा करने जा रहे हैं, तो कंटेनर के सदस्य प्रकारों का उपयोग करना बेहतर है, यदि वे उपलब्ध हैं और उपयुक्त हैं। इस कार्य के लिए std::vectorएक सदस्य प्रकार को बुलाया गया है size_type: यह वह sizeतरीका है जो विधि द्वारा लौटाया गया है ।
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
क्यों नहीं इस iteratorसमाधान का उपयोग करें ? साधारण मामलों के लिए आप भी हो सकते हैं, लेकिन मुद्दा यह है कि iteratorवर्ग एक ऐसी वस्तु है जिसे इस काम के लिए और अधिक जटिल वस्तुओं के लिए डिज़ाइन किया गया है जहाँ यह समाधान आदर्श नहीं होने जा रहा है।
रेंज लूप के लिए (C ++ 11)
जेफरी का हल देखें । C ++ 11 (और बाद में) में आप नए रेंज-आधारित forलूप का उपयोग कर सकते हैं , जो इस तरह दिखता है:
for (auto i: path)
std::cout << i << ' ';
चूंकि pathवस्तुओं का एक सदिश (स्पष्ट रूप से std::vector<char>) है, वस्तु iसदिश के प्रकार की वस्तु है (यानी, स्पष्ट रूप से, यह प्रकार की है char)। ऑब्जेक्ट iका एक मान होता है जो pathऑब्जेक्ट में वास्तविक आइटम की एक प्रति है । इस प्रकार, iलूप के सभी परिवर्तन pathअपने आप में संरक्षित नहीं हैं । साथ ही, यदि आप तथ्य यह है कि आप की प्रतिलिपि बनाई मान बदलने के लिए सक्षम होने के लिए नहीं करना चाहते हैं लागू करने के लिए चाहते हैं iपाश में, आप के प्रकार के लिए मजबूर कर सकते iहोने के लिए const charइस तरह:
for (const auto i: path)
std::cout << i << ' ';
यदि आप आइटम को संशोधित करना चाहते हैं path, तो आप एक संदर्भ का उपयोग कर सकते हैं:
for (auto& i: path)
std::cout << i << ' ';
और यहां तक कि अगर आप संशोधित नहीं करना चाहते हैं path, अगर वस्तुओं की नकल महंगी है, तो आपको मूल्य द्वारा कॉपी करने के बजाय एक कास्ट संदर्भ का उपयोग करना चाहिए:
for (const auto& i: path)
std::cout << i << ' ';
std :: प्रतिलिपि
यहोशू का जवाब देखिए । आप std::copyआउटपुट स्ट्रीम पर वेक्टर सामग्री की प्रतिलिपि बनाने के लिए STL एल्गोरिथ्म का उपयोग कर सकते हैं । यह एक सुरुचिपूर्ण समाधान है यदि आप इसके साथ सहज हैं (और इसके अलावा, यह बहुत उपयोगी है, न कि इस तरह के वेक्टर की सामग्री को मुद्रित करने के मामले में)।
std :: for_each
मैक्स का समाधान देखें । का उपयोग करते हुए std::for_eachइस सरल परिदृश्य के लिए overkill है, लेकिन यह एक बहुत ही उपयोगी समाधान है अगर तुम सिर्फ स्क्रीन पर प्रिंट की तुलना में अधिक करना चाहता था: का उपयोग कर std::for_eachआप क्या करने की अनुमति देता है किसी भी वेक्टर सामग्री पर (समझदार) आपरेशन।
अधिभार ओस्ट्रीम :: ऑपरेटर <<
क्रिस के जवाब को देखें , यह अन्य उत्तरों के लिए अधिक पूरक है क्योंकि आपको अभी भी ओवरलोडिंग में उपरोक्त समाधानों में से एक को लागू करने की आवश्यकता होगी। अपने उदाहरण में उन्होंने एक forलूप में एक काउंटर का उपयोग किया । उदाहरण के लिए, यह है कि आप जल्दी से यहोशू के समाधान का उपयोग कैसे कर सकते हैं :
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
किसी भी अन्य समाधान का उपयोग सीधा होना चाहिए।
निष्कर्ष
यहां प्रस्तुत कोई भी समाधान काम करेगा। यह आपके ऊपर है और कोड जिस पर "सबसे अच्छा" है। इससे अधिक विस्तृत कुछ भी संभवत: किसी अन्य प्रश्न के लिए सबसे अच्छा बचा है जहां पेशेवरों / विपक्ष का सही मूल्यांकन किया जा सकता है; लेकिन हमेशा की तरह उपयोगकर्ता वरीयता हमेशा एक हिस्सा निभाएगी: प्रस्तुत किए गए समाधानों में से कोई भी गलत नहीं है, लेकिन कुछ प्रत्येक व्यक्तिगत कोडर के लिए अच्छे लगेंगे।
परिशिष्ट
यह मेरे द्वारा पोस्ट किए गए पहले के एक विस्तारित समाधान है। चूँकि उस पोस्ट पर ध्यान दिया जा रहा था, मैंने इस पर विस्तार करने और यहाँ पोस्ट किए गए अन्य उत्कृष्ट समाधानों को संदर्भित करने का निर्णय लिया। मेरी मूल पोस्ट में एक टिप्पणी थी जिसमें उल्लेख किया गया था कि यदि आप एक लूप के अंदर अपने वेक्टर को संशोधित करने का इरादा कर रहे थे,for तो std::vectorतत्वों को एक्सेस करने के लिए दो तरीके प्रदान किए गए हैं: std::vector::operator[]जो सीमा की जाँच नहीं करता है, और std::vector::atजो सीमा जाँच करता है। दूसरे शब्दों में, atफेंक देंगे यदि आप वेक्टर के बाहर एक तत्व का उपयोग करने की कोशिश करते हैं और operator[]नहीं करेंगे। मैंने केवल इस टिप्पणी को जोड़ा है, मूल रूप से, किसी चीज का उल्लेख करने के लिए, जो किसी को पहले से ही नहीं होने के बारे में जानना उपयोगी हो सकता है। और मुझे अब कोई फर्क नहीं दिखता। इसलिए यह परिशिष्ट।