अपने प्रश्न का उत्तर देने के लिए, आप एक पुनरावृत्ति का उपयोग कर सकते हैं:
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[]
नहीं करेंगे। मैंने केवल इस टिप्पणी को जोड़ा है, मूल रूप से, किसी चीज का उल्लेख करने के लिए, जो किसी को पहले से ही नहीं होने के बारे में जानना उपयोगी हो सकता है। और मुझे अब कोई फर्क नहीं दिखता। इसलिए यह परिशिष्ट।