2009-08-22 10 views
43

अक्सर एक स्ट्रिंग (या किसी भी संख्यात्मक वस्तु) के माध्यम से पुनरावृत्ति करते समय, हम न केवल वर्तमान मूल्य में रुचि रखते हैं, बल्कि स्थिति (सूचकांक) भी रुचि रखते हैं।मैं स्ट्रिंग के माध्यम से कैसे पुन: प्रयास कर सकता हूं और इंडेक्स (वर्तमान स्थिति) को भी जान सकता हूं?

string str ("Test string"); 
    string::iterator it; 
    int index = 0; 
    for (it = str.begin() ; it < str.end(); it++ ,index++) 
    { 
     cout << index << *it; 
    } 

शैली से ऊपर लगता है 'सी शैली'

string str ("Test string"); 
    for (int i = 0 ; i < str.length(); i++) 
    { 
     cout << i << str[i] ; 
    } 

रूबी में बेहतर करने के लिए प्रतीत नहीं होता है, हम दोनों सामग्री प्राप्त कर सकते हैं: string::iterator का उपयोग करके इसे पूरा करने के हम एक अलग अनुक्रमणिका बनाए रखने के लिए है और एक सुरुचिपूर्ण ढंग से सूचकांक:

"hello".split("").each_with_index {|c, i| puts "#{i} , #{c}" } 

तो, सी में सबसे अच्छा अभ्यास है ++ एक गणनीय वस्तु के माध्यम से पुनरावृति करने के लिए है और यह भी वर्तमान सूचकांक का ट्रैक रखने?


    std::string s("Test string"); 
    std::string::iterator it = s.begin(); 

    //Use the iterator... 
    ++it; 
    //... 

    std::cout << "index is: " << std::distance(s.begin(), it) << std::endl; 

उत्तर

34

मैंने कभी नहीं सुना है इस विशिष्ट प्रश्न के लिए एक सर्वोत्तम अभ्यास का। हालांकि, सामान्य रूप से एक सबसे अच्छा अभ्यास समस्या का समाधान करने वाले सबसे सरल समाधान का उपयोग करना है। इस मामले में सरणी-शैली का उपयोग (या सी-स्टाइल यदि आप इसे कॉल करना चाहते हैं) इंडेक्स वैल्यू उपलब्ध होने पर पुनरावृत्ति करने का सबसे आसान तरीका है। तो मैं निश्चित रूप से उस तरह की सिफारिश करेंगे।

+0

एक उदाहरण अच्छा होगा: पी –

42
इस तरह

पठनीयता पर आधारित होगा, जैसे:

string str ("Test string"); 
for (int index = 0, auto it = str.begin(); it < str.end(); ++it) 
    cout << index++ << *it; 

या:

string str ("Test string"); 
for (int index = 0, auto it = str.begin(); it < str.end(); ++it, ++index) 
    cout << index << *it; 

या अपने मूल:

string str ("Test string"); 
int index = 0; 
for (auto it = str.begin() ; it < str.end(); ++it, ++index) 
    cout << index << *it; 

आदि जो भी सबसे आसान और आप के लिए साफ है।

यह स्पष्ट नहीं है कि कोई भी सर्वोत्तम अभ्यास है क्योंकि आपको कहीं काउंटर वैरिएबल की आवश्यकता होगी। सवाल यह प्रतीत होता है कि आप इसे कहां परिभाषित करते हैं और यह कैसे बढ़ता है आपके लिए अच्छा काम करता है।

1

तार के लिए, आप string.c_str() उपयोग कर सकते हैं जो आप वापस आ जाएगी एक स्थिरांक चार * है, जो एक सरणी, उदाहरण के रूप में इलाज किया जा सकता:

const char* strdata = str.c_str(); 

for (int i = 0; i < str.length(); ++i) 
    cout << i << strdata[i]; 
+0

यह प्रश्न मेरे जैसा ही है, इसलिए मैं यहां पूछूंगा कि आप स्टर्डटा [i] से "" के मूल्य की तुलना कैसे करते हैं? क्या इसे चार में बदलने का कोई तरीका है? – frogeyedpeas

6

एक अच्छा अभ्यास

+0

मेरा पिछला संपादन सही है, @ एलेक्स रेनॉल्ड्स। जांचें ['C++ 'में' लूप 'के प्रारंभिक निकाय में विभिन्न प्रकार के दो चर घोषित करना संभव नहीं है।] (Https://stackoverflow.com/questions/2687392/is-it-possible-to-declare -वो-वेरिएबल्स-ऑफ-अलग-प्रकार-इन-ए-फॉर-लूप) और [यह] (https://ideone.com/lngBfo)। – Bateman

19

के रूप में पहले

index = std::distance(s.begin(), it); 

भी उल्लेख आप मानक एसटीएल समारोह दूरी का उपयोग कर सकते हैं, तो आप ग की तरह इंटरफेस के साथ स्ट्रिंग और कुछ अन्य कंटेनरों का उपयोग कर सकते हैं:

for (i=0;i<string1.length();i++) string1[i]; 
+2

बीटीडब्ल्यू, मेरे कार्यान्वयन सूचकांक में बहुत तेज काम करता है कि इटरेटर (5x और अधिक) – Andrew

3

मैं इसका उपयोग करूंगा-str.begin() इस विशेष मामले में std :: दूरी और ऑपरेटर- वही हैं। लेकिन अगर कंटेनर यादृच्छिक अभिगम के बिना कुछ बदल जाएगा, तो std :: दूरी पहले तर्क तक बढ़ेगी जब तक कि यह दूसरी तक न पहुंच जाए, इस प्रकार रैखिक समय और ऑपरेटर दे - संकलित नहीं होगा। व्यक्तिगत तौर पर मैं दूसरे व्यवहार पसंद करते हैं - यह अधिसूचित किया जाना बेहतर है जब आप हे से एल्गोरिथ्म (एन) ओ बन गया (एन^2) ...

1

std::distance के बाद से, यादृच्छिक अभिगम iterators के लिए केवल निरंतर समय है मैं शायद होगा स्पष्ट इटरेटर अंकगणित पसंद करते हैं। इसके अलावा, चूंकि हम यहां सी ++ कोड लिख रहे हैं, मुझे विश्वास है कि सी-स्टाइल दृष्टिकोण पर अधिक सी ++ मुहावरेदार समाधान बेहतर है।

string str{"Test string"}; 
auto begin = str.begin(); 

for (auto it = str.begin(), end = str.end(); it != end; ++it) 
{ 
    cout << it - begin << *it; 
} 
संबंधित मुद्दे

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