क्योंकि मुझे वन-लाइनर्स से प्यार है (वे सभी प्रकार के अजीब सामानों के लिए बहुत उपयोगी हैं, जैसा कि आप अंत में देखेंगे), यहाँ std का उपयोग कर एक समाधान है :: संचय और C ++ 11 लैंबडा:
std::accumulate(alist.begin(), alist.end(), std::string(),
[](const std::string& a, const std::string& b) -> std::string {
return a + (a.length() > 0 ? "," : "") + b;
} )
मैं इस सिंटैक्स को स्ट्रीम ऑपरेटर के साथ उपयोगी मानता हूं, जहां मैं स्ट्रीम ऑपरेशन से सभी प्रकार के अजीब तर्क को दायरे से बाहर नहीं करना चाहता, बस एक साधारण स्ट्रिंग में शामिल होने के लिए। उदाहरण के लिए इस रिटर्न स्टेटमेंट पर विचार करें कि स्ट्रीम ऑपरेटर्स (std का उपयोग करके स्ट्रिंग);
return (dynamic_cast<ostringstream&>(ostringstream()
<< "List content: " << endl
<< std::accumulate(alist.begin(), alist.end(), std::string(),
[](const std::string& a, const std::string& b) -> std::string {
return a + (a.length() > 0 ? "," : "") + b;
} ) << endl
<< "Maybe some more stuff" << endl
)).str();
अपडेट करें:
जैसा कि @plexando द्वारा टिप्पणियों में बताया गया है, उपरोक्त कोड दुर्व्यवहार से ग्रस्त है जब सरणी इस तथ्य के कारण खाली तारों से शुरू होती है कि "पहले रन" के लिए चेक पिछले रन से गायब है, जिसके परिणामस्वरूप कोई अतिरिक्त वर्ण नहीं है, और यह भी। सभी रन पर "पहले रन" के लिए एक चेक चलाना अजीब है (यानी कोड अंडर-अनुकूलित है)।
इन दोनों समस्याओं का समाधान आसान है यदि हम इस तथ्य के लिए जानते हैं कि सूची में कम से कम एक तत्व है। OTOH, अगर हम एक तथ्य यह है कि सूची के लिए पता नहीं है कम से कम एक तत्व है, तो हम रन और भी छोटा कर सकते हैं।
मुझे लगता है कि परिणामी कोड बहुत सुंदर नहीं है, इसलिए मैं इसे यहां सही समाधान के रूप में जोड़ रहा हूं , लेकिन मुझे लगता है कि ऊपर चर्चा अभी भी पूरी तरह से है:
alist.empty() ? "" :
++alist.begin(), alist.end(),
*alist.begin(),
[](auto& a, auto& b) { return a + "," + b; });
टिप्पणियाँ:
- पहले तत्व तक सीधी पहुंच का समर्थन करने वाले कंटेनरों के लिए, संभवतः तीसरे तर्कों के लिए इसका उपयोग करना बेहतर है, इसलिए
alist[0]
वैक्टर के लिए।
- टिप्पणियों और चैट में चर्चा के अनुसार, लैम्बडा अभी भी कुछ कॉपी करता है। इसके बजाय (कम सुंदर) लंबोदा का उपयोग करके इसे कम किया जा सकता है:
[](auto&& a, auto&& b) -> auto& { a += ','; a += b; return a; })
जो (जीसीसी 10 पर) x10 से अधिक के प्रदर्शन में सुधार करता है। सुझाव के लिए @Deduplicator का धन्यवाद। मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि यहां क्या हो रहा है।