2011-04-18 9 views
7

मैं एक सिंगल कैरेक्टर या स्ट्रिंग पर एक स्ट्रिंग को विभाजित करना चाहता हूं। मैं boost::split का उपयोग करना चाहता हूं क्योंकि बूस्ट स्ट्रिंग मूल स्ट्रिंग हैंडलिंग के लिए हमारा मानक है (मैं कई तकनीकों को मिश्रण नहीं करना चाहता)।बूस्ट एक सिंगल कैरेक्टर या सिर्फ एक स्ट्रिंग के साथ विभाजित

एकल वर्ण मामले में मैं split(vec,str,is_any_of(':')) कर सकता था लेकिन मैं जानना चाहता हूं कि केवल एक ही वर्ण निर्दिष्ट करने का कोई तरीका है या नहीं। यह प्रदर्शन में सुधार कर सकता है, लेकिन अधिक महत्वपूर्ण बात यह है कि कोड केवल एक ही चरित्र के साथ स्पष्ट होगा, क्योंकि is_any_of एक अलग अर्थ बताता है जो मैं चाहता हूं।

एक स्ट्रिंग के खिलाफ मिलान करने के लिए मुझे नहीं पता कि किस वाक्यविन्यास का उपयोग करना है। मैं एक रेगेक्स बनाना नहीं चाहता; split(vec,str,match_str("::") जैसे कुछ सरल वाक्यविन्यास अच्छे होंगे।

उत्तर

3

के शीर्ष पर कार्यक्षमता को कार्यान्वित कर सकते हैं निम्नलिखित कोड में, मुझे using namespace boost ब्रेवटी के लिए मान लें।
एक चरित्र पर बंटवारे का सवाल है, अगर केवल algorithm/string अनुमति दी है, is_from_range उद्देश्य पूरा हो सकता है:

split(vec,str, is_from_range(':',':')); 

वैकल्पिक रूप से, अगर lambda अनुमति दी है:

split(vec,str, lambda::_1 == ':'); 

या यदि एक समर्पित विधेय की तैयारी कर रहा है अनुमत:

struct match_char { 
    char c; 
    match_char(char c) : c(c) {} 
    bool operator()(char x) const { return x == c; } 
}; 

split(vec,str, match_char(':')); 

मिलान के लिए एक स्ट्रिंग के खिलाफ आईएनजी, डेविड रोड्रिगुएज़ का उल्लेख किया गया है, split के साथ रास्ता नहीं लगता है। तो iter_split अनुमति दी है, शायद निम्नलिखित कोड उद्देश्य को पूरा करेगा:

iter_split(vec,str, first_finder("::")); 
+0

वे सभी अच्छे हैं। धन्यवाद। –

+0

मुझे खुशी है कि इससे मदद मिली :-) –

+1

सी ++ 11 उत्तर: '[] (char c) {वापसी c == ':'} 'i.e. देशी lambda। – MSalters

1

सरल टोकन पर, मैं केवल is_any_of छोड़ दूंगा क्योंकि यह समझने में काफी आसान है कि is_any_of(single_option) का अर्थ क्या है। यदि आप वास्तव में इसे बदलने की तरह महसूस करते हैं, तो तीसरा तत्व एक मज़ेदार है, इसलिए आप equals फ़ंक्शन को split फ़ंक्शन पर पास कर सकते हैं।

वह दृष्टिकोण वास्तव में एकाधिक टोकन के साथ काम नहीं करेगा, क्योंकि पुनरावृत्ति चरित्र द्वारा characater होने के लिए है। मुझे पूर्वनिर्धारित विकल्पों की पेशकश करने के लिए पर्याप्त पुस्तकालय नहीं पता है, लेकिन आप

10

मैं एक ही जवाब के लिए देख रहा था लेकिन मैं एक नहीं मिल सका। अंततः मैं अपने आप को एक उत्पादन करने में कामयाब रहा।

आप जिस भविष्यवाणी की आवश्यकता है उसे बनाने के लिए आप std::equal_to का उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

boost::split(container, str, std::bind1st(std::equal_to<char>(), ',')); 

यह वास्तव में कैसे मैं यह कर जब मैं एक एकल वर्ण का उपयोग कर एक स्ट्रिंग विभाजित करने की आवश्यकता है।

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