बढ़ते संकेत मुहावरेदार सी ++ हैं, क्योंकि सूचक शब्दार्थ सी ++ मानक पुस्तकालय (अलेक्जेंडर स्टेपानोव के एसटीएल से दूर) के पीछे डिजाइन दर्शन के एक मूलभूत पहलू को दर्शाते हैं ) के
यहां महत्वपूर्ण अवधारणा यह है कि एसटीएल कंटेनर, एल्गोरिदम और पुनरावृत्तियों के आसपास डिज़ाइन किया गया है। संकेत बस पुनरावृत्तियों हैं ।
बेशक, संकेत को बढ़ाने (या जोड़ने / घटाने) की क्षमता सी पर वापस जाती है। सी-स्ट्रिंग हेरफेर एल्गोरिदम के बहुत से बस सूचक अंकगणितीय का उपयोग करके लिखा जा सकता है। निम्नलिखित कोड पर विचार करें:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
यह कोड एक शून्य-समाप्त सी-स्ट्रिंग की प्रतिलिपि बनाने के लिए सूचक अंकगणितीय का उपयोग करता है। लूप स्वचालित रूप से समाप्त हो जाता है जब यह नल का सामना करता है।
C ++ के साथ, सूचक शब्दार्थकों को पुनरावृत्तियों की अवधारणा के लिए सामान्यीकृत किया जाता है । अधिकांश मानक C ++ कंटेनर पुनरावृत्तियों प्रदान करते हैं, जिन्हें begin
और end
सदस्य कार्यों के माध्यम से पहुँचा जा सकता है । इटरेटर्स पॉइंटर्स की तरह व्यवहार करते हैं, इसमें उन्हें इंक्रीमेंट, डीरेफरेंस और कभी-कभी डीक्रिएट या एडवांस्ड किया जा सकता है।
इस पर पुनरावृति करने के लिए std::string
, हम कहेंगे:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
हम पुनरावृत्ति को वैसे ही बढ़ाते हैं जैसे हम एक साधारण सी-स्ट्रिंग के लिए एक संकेतक बढ़ाते हैं। इस अवधारणा के शक्तिशाली होने का कारण यह है कि आप ऐसे कार्यों को लिखने के लिए टेम्प्लेट का उपयोग कर सकते हैं जो किसी भी प्रकार के इटेटर के लिए काम करेंगे जो आवश्यक अवधारणा आवश्यकताओं को पूरा करता है। और यह एसटीएल की शक्ति है:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
यह कोड एक स्ट्रिंग को वेक्टर में कॉपी करता है। copy
समारोह है कि के साथ काम करेंगे एक टेम्पलेट है किसी भी (जो सादे संकेत भी शामिल है) इटरेटर कि समर्थन करता है incrementing। हम copy
सादे C- स्ट्रिंग पर समान फ़ंक्शन का उपयोग कर सकते हैं :
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
हम copy
एक std::map
या एक std::set
या किसी पर उपयोग कर सकते हैं कस्टम कंटेनर जो पुनरावृत्तियों का समर्थन करते हैं।
ध्यान दें कि पॉइंटर्स एक विशिष्ट प्रकार के पुनरावृत्ति हैं: रैंडम एक्सेस इटरेटर , जिसका अर्थ है कि वे ऑपरेटर +
और -
ऑपरेटर के साथ वेतन वृद्धि, गिरावट, और आगे बढ़ने का समर्थन करते हैं । अन्य पुनरावृत्त प्रकार केवल सूचक सिमेंटिक्स के एक उपसमूह का समर्थन करते हैं: एक द्विदिश पुनरावृत्ति कम से कम वेतन वृद्धि और क्षय का समर्थन करता है; एक आगे चलने वाला कम से कम वेतन वृद्धि का समर्थन करता है। (सभी पुनरावृत्त प्रकार dereferencing का समर्थन करते हैं।) copy
फ़ंक्शन को एक पुनरावृत्ति की आवश्यकता होती है जो कम से कम वेतन वृद्धि का समर्थन करता है।
आप विभिन्न पुनरावृत्त अवधारणाओं के बारे में यहां पढ़ सकते हैं ।
तो, इंक्रीमेंटिंग पॉइंटर्स C-array पर C-array, या एक्सेस एलिमेंट्स / ऑफसेट्स को इटरेट करने का एक आइडियल सी ++ तरीका है।