2009-08-10 66 views
8

我想使用boost字符串算法進行不區分大小寫的搜索。
總的新手在這裏。boost :: ifind_first與std :: string對象

如果我以這種方式使用它,我會收到錯誤消息。

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

轉換爲char指針可以解決問題。

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; 

編輯:在typedef中使用const iterator_range允許傳遞臨時範圍。

+0

ifind_first()的第一個參數是Range1T&。通過臨時範圍並不是標準。 – 2016-06-29 10:05:02

+0

@DanielLaügt:'Range1T'將被推斷爲'const boost :: iterator_range ',產生一個const引用。將一個const引用傳遞給臨時對象有問題嗎? – 2016-06-29 15:21:40

+0

我還沒有看到iterator_range之前的const。這工作正常。我不知道我們可以做這種伎倆。我學到了一些東西。謝謝。 – 2016-07-14 16:38:19

0

像這樣的東西會在不修改任何字符串的情況下對字符串進行不區分大小寫的比較。

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_castconst_cast<char*>(str.c_str())。我非常懷疑,爲了搜索字符串,必須丟棄const

我從來沒有使用boost::ifind_first,但根據documentation,該函數需要兩個範圍。我想有一種方法可以從字符串創建一個範圍? OTOH,我想知道弦是不是一個完美的範圍。

如果您發佈了您使用的編譯器的完整錯誤消息,可能會有幫助。

相關問題