2009-08-10 14 views
8

मैं असंवेदनशील खोज के मामले में बूस्ट स्ट्रिंग एल्गोरिदम का उपयोग करने की कोशिश कर रहा हूं।
कुल नौसिखिया यहां।बूस्ट :: ifind_first std :: स्ट्रिंग ऑब्जेक्ट्स

अगर मैं इसे इस तरह उपयोग कर रहा हूं, तो मुझे एक त्रुटि मिलती है।

std::string str1("Hello world"); 
std::string str2("hello"); 
if (boost::ifind_first(str1, str2)) some code; 

संकेत दिए गए चार में कनवर्ट कर समस्या हल करता है।

boost::ifind_first((char*)str1.c_str(), (char*)str2.c_str()); 

क्या std :: string ऑब्जेक्ट्स को सीधे खोजने का कोई तरीका है?

इसके अलावा, शायद यह जानने का एक और तरीका है कि स्ट्रिंग मौजूद है, चाहे किसी अन्य स्ट्रिंग के अंदर केस-असंवेदनशील खोज हो?

उत्तर

12

आपको boost :: iterator_range का उपयोग करने की आवश्यकता है। यह काम करता है:

typedef const boost::iterator_range<std::string::const_iterator> StringRange; 
    std::string str1("Hello world"); 
    std::string str2("hello"); 

    if (boost::ifind_first(
      StringRange(str1.begin(), str1.end()), 
      StringRange(str2.begin(), str2.end()))) 
     std::cout << "Found!" << std::endl; 

संपादित करें: टाइपिफ़ में एक const iterator_range का उपयोग करना अस्थायी सीमा को पार करने की अनुमति देता है।

+0

ifind_first() का पहला तर्क श्रेणी 1T और है। एक अस्थायी सीमा पारित करने के लिए मानक नहीं है। –

+0

@ डैनियललाउग: 'रेंज 1 टी' को 'कॉन्स बूस्ट :: iterator_range ' के रूप में घटाया जाएगा, जिसके परिणामस्वरूप एक कॉन्स्ट संदर्भ होगा। अस्थायी के लिए एक संदर्भ संदर्भ पारित करने में आपको कोई समस्या है? –

+0

मैंने iterator_range से पहले कॉन्स नहीं देखा है। यह ठीक काम करता है। मुझे नहीं पता था कि हम इस तरह की चाल कर सकते हैं। मैंने कुछ सीख लिया है। धन्यवाद। –

0

ऐसा कुछ स्ट्रिंग को संशोधित किए बिना स्ट्रिंग की केस-असंवेदनशील तुलना करेगा। const_cast<char*>(str.c_str()):

int nocase_cmp(const string & s1, const string& s2) 
{ 
    string::const_iterator it1=s1.begin(); 
    string::const_iterator it2=s2.begin(); 

    //stop when either string's end has been reached 
    while ((it1!=s1.end()) && (it2!=s2.end())) 
    { 
    if(::toupper(*it1) != ::toupper(*it2)) //letters differ? 
    // return -1 to indicate smaller than, 1 otherwise 
    return (::toupper(*it1) < ::toupper(*it2)) ? -1 : 1; 
    //proceed to the next character in each string 
    ++it1; 
    ++it2; 
    } 
    size_t size1=s1.size(), size2=s2.size();// cache lengths 
    //return -1,0 or 1 according to strings' lengths 
    if (size1==size2) { 
    return 0; 
    } 
    return (size1<size2) ? -1 : 1; 
} 

0

(char*)str.c_str() वास्तव में एक const_cast प्रदर्शन कर रहा है। मुझे बहुत गंभीरता से संदेह है कि स्ट्रिंग के माध्यम से खोजने के लिए const को दूर करना आवश्यक है।

मैंने कभी भी boost::ifind_first का उपयोग नहीं किया है, लेकिन documentation के अनुसार, फ़ंक्शन में दो श्रेणियां होती हैं। मुझे लगता है कि एक स्ट्रिंग से एक रेंज बनाने का कोई तरीका है? ओटीओएच, मुझे आश्चर्य होगा कि एक स्ट्रिंग एक पूर्ण सीमा नहीं थी।

यदि आप उपयोग किए गए कंपाइलर के पूर्ण त्रुटि संदेश पोस्ट करते हैं तो यह सहायक हो सकता है।

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