रेंजरों के पहले और बाद में C ++ कोड उदाहरण

फिर से नमस्कार। निम्नलिखित सामग्री का अनुवाद विशेष रूप से पाठ्यक्रम "सी ++ डेवलपर" के छात्रों के लिए तैयार किया गया था, जिन पर कक्षाएं 27 जून से शुरू होंगी।



पिछले नवंबर में सैन डिएगो में मानक समिति की बैठक में सी ++ 20 में रेंज्स लाइब्रेरी को अपनाया गया था। पुस्तकालय हमारे कोड को सरल बनाने के लिए डिज़ाइन किए गए मानों की प्रसंस्करण श्रेणियों के लिए घटक प्रदान करता है। दुर्भाग्य से, रेंज्स लाइब्रेरी बहुत अच्छी तरह से प्रलेखित नहीं है, जो उन लोगों के लिए समझना मुश्किल है जो इसे मास्टर करना चाहते हैं। यह पोस्ट रंग का उपयोग करके और बिना लिखे हुए कोड के उदाहरण प्रदान करने के लिए है।

एरिक नीब्लर की रेंज लाइब्रेरी कार्यान्वयन यहाँ उपलब्ध है । यह क्लैंग 3.6.2 या बाद के संस्करण के साथ काम करता है, जीसीसी 5.2 या बाद में, और वीसी ++ 15.9 या बाद में। नीचे दिए गए कोड उदाहरण संकलक के नवीनतम संस्करणों के साथ लिखे और परीक्षण किए गए हैं। यह ध्यान देने योग्य है कि ये उदाहरण विशिष्ट कार्यान्वयन हैं और जरूरी नहीं कि एकमात्र समाधान है जिसके साथ आप आ सकते हैं।

हालांकि रेंज लाइब्रेरी के लिए मानक नाम स्थान std::ranges , इस वर्तमान पुस्तकालय कार्यान्वयन में यह ranges::v3

निम्नलिखित नामस्थान उपनामों का उपयोग नीचे दिए गए उदाहरणों में किया गया है:

 namespace rs = ranges::v3; namespace rv = ranges::v3::view; namespace ra = ranges::v3::action; 

इसके अलावा, सरलीकरण के लिए, हम निम्नलिखित वस्तुओं, कार्यों और लंबों का उल्लेख करेंगे:

 std::string to_roman(int value) { std::vector<std::pair<int, char const*>> roman { { 1000, "M" },{ 900, "CM" }, { 500, "D" },{ 400, "CD" }, { 100, "C" },{ 90, "XC" }, { 50, "L" },{ 40, "XL" }, { 10, "X" },{ 9, "IX" }, { 5, "V" },{ 4, "IV" }, { 1, "I" } }; std::string result; for (auto const & [d, r]: roman) { while (value >= d) { result += r; value -= d; } } return result; } std::vector<int> v{1,1,2,3,5,8,13,21,34}; auto print_elem = [](auto const e) {std::cout << e << '\n'; }; auto is_even = [](auto const i) {return i % 2 == 0; }; 

APDATE : मैं एरिक निबलर और बाकी सभी को धन्यवाद देना चाहूंगा जिन्होंने नीचे टिप्पणी की थी, इन कोड उदाहरणों के लिए सुझाव। मैंने उनकी समीक्षाओं के आधार पर कुछ अपडेट किया।

रेंज के सभी तत्वों को प्रिंट करें:

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::for_each( std::cbegin(v), std::cend(v), print_elem); // or for(auto const i : v) { print_elem(i); }; 
 rs::for_each( std::cbegin(v), std::cend(v), print_elem); // or rs::for_each(std::as_const(v), print_elem); 


रेंज के सभी तत्वों को रिवर्स ऑर्डर में प्रिंट करें:

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::for_each( std::crbegin(v), std::crend(v), print_elem); 
 rs::for_each( std::crbegin(v), std::crend(v), print_elem); // or for (auto const i : v | rv::reverse) { print_elem(i); }; 


रेंज के केवल तत्वों को प्रिंट करें, लेकिन रिवर्स ऑर्डर में:

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::for_each( std::crbegin(v), std::crend(v), [print_elem](auto const i) { if(i % 2 == 0) print_elem(i); }); 
 for (auto const i : v | rv::reverse | rv::filter(is_even)) { print_elem(i); }; 


रेंज के पहले दो तत्वों को छोड़ें और निम्नलिखित तीन में से भी केवल प्रिंट करें:

पर्वतमाला तकबजने के बाद
सी ++सी ++
 auto it = std::cbegin(v); std::advance(it, 2); auto ix = 0; while (it != std::cend(v) && ix++ < 3) { if (is_even(*it)) print_elem(*it); it++; } 
 for (auto const i : v | rv::drop(2) | rv::take(3) | rv::filter(is_even)) { print_elem(i); }; 


101 से 200 तक संख्याएँ प्रिंट करें:

पर्वतमाला तकबजने के बाद
सी ++सी ++
 for (int n = 101; n <= 200; ++n) { print_elem(n); } 
 for (auto n : rs::iota_view(101, 201)) { print_elem(n); } 


101 से 200 तक सभी रोमन अंकों को प्रिंट करें। किसी संख्या को संबंधित रोमन संख्या में परिवर्तित करने के लिए, ऊपर दिखाए to_roman() फ़ंक्शन का उपयोग करें।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 for (int i = 101; i <= 200; ++i) { print_elem(to_roman(i)); } 
 for (auto n : rs::iota_view(101, 201) | rv::transform(to_roman)) { print_elem(n); } // or rs::for_each(rv::iota(101, 201), print_element, to_roman); 


पिछले क्रम में 7 से विभाज्य अंतिम तीन संख्याओं के रोमन अंकों को प्रिंट करें [101, 200], उल्टे क्रम में।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 for (int n = 200, count=0; n >= 101 && count < 3; --n) { if (n % 7 == 0) { print_elem(to_roman(n)); count++; } } 
 for (auto n : rs::iota_view(101, 201) | rv::reverse | rv::filter([](auto v) { return v % 7 == 0; }) | rv::transform(to_roman) | rv::take(3)) { print_elem(n); } 


पिछले तीन नंबरों के रोम अंकों वाले स्ट्रिंग्स की एक श्रृंखला बनाएं, जो रिवर्स ऑर्डर में 7 [गुणांक 101, 200] के गुणक हैं।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::vector<std::string> v; for (int n = 200, count = 0; n >= 101 && count < 3; --n) { if (n % 7 == 0) { v.push_back(to_roman(n)); count++; } } 
 auto v = rs::iota_view(101, 201) | rv::reverse | rv::filter([](auto v) {return v % 7 == 0; }) | rv::transform(to_roman) | rv::take(3) | rs::to_vector; 


अनसोल्ड रेंज को बदलें ताकि यह केवल अद्वितीय मानों को बरकरार रखे, लेकिन रिवर्स ऑर्डर में।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::vector<int> v{ 21, 1, 3, 8, 13, 1, 5, 2 }; std::sort(std::begin(v), std::end(v)); v.erase( std::unique(std::begin(v), std::end(v)), std::end(v)); std::reverse(std::begin(v), std::end(v)); 
 std::vector<int> v{ 21, 1, 3, 8, 13, 1, 5, 2 }; v = std::move(v) | ra::sort | ra::unique | ra::reverse; 


दो सबसे छोटे और श्रेणी के दो सबसे बड़े मानों को हटा दें और दूसरी श्रेणी में दिए गए शेष को छोड़ दें।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::vector<int> v{ 21, 1, 3, 8, 13, 1, 5, 2 }; std::vector<int> v2 = v; std::sort(std::begin(v2), std::end(v2)); auto first = std::begin(v2); std::advance(first, 2); auto last = first; std::advance(last, std::size(v2) - 4); v2.erase(last, std::end(v2)); v2.erase(std::begin(v2), first); 
 std::vector<int> v{ 21, 1, 3, 8, 13, 1, 5, 2 }; auto v2 = v | rs::copy | ra::sort | ra::slice(2, rs::end - 2); 


दिए गए रेंज में सभी पंक्तियों को एक मान में मिलाएं।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 std::vector<std::string> words { "Lorem", " ", "ipsum", " ", "dolor", " ", "sit", " ", "amet"}; std::string text; for (auto const & word : words) text += word; 
 std::vector<std::string> words { "Lorem", " ", "ipsum", " ", "dolor", " ", "sit", " ", "amet"}; std::string text = words | rs::move | ra::join; 


पाठ में शब्दों की संख्या (एक स्थान से अलग) की गणना करें।

पर्वतमाला तकबजने के बाद
सी ++सी ++
 auto text = "Lorem ipsum dolor sit amet"; std::istringstream iss(text); std::vector<std::string> words( std::istream_iterator<std::string>{iss}, std::istream_iterator<std::string>()); auto count = words.size(); // or size_t count = 0; std::vector<std::string> words; std::string token; std::istringstream tokenStream(text); while (std::getline(tokenStream, token, ' ')) { ++count; } 
 auto text = "Lorem ipsum dolor sit amet"; auto count = rs::distance( rv::c_str(text) | rv::split(' ')); 


क्या लेख आपके लिए मददगार था? टिप्पणियों में लिखें।

Source: https://habr.com/ru/post/hi456452/


All Articles