2009-08-10 13 views
8

Sto cercando di utilizzare gli algoritmi boost string per la ricerca senza distinzione tra maiuscole e minuscole.
newbie totale qui.boost :: ifind_first con std :: string objects

se lo sto usando in questo modo, ottengo un errore.

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

La conversione in puntatori di caratteri risolve il problema.

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

C'è un modo per cercare direttamente gli oggetti std :: string?

Inoltre, forse c'è un altro modo per sapere se la stringa è presente all'interno di un'altra stringa con ricerca senza distinzione tra maiuscole e minuscole?

risposta

12

È necessario utilizzare boost :: iterator_range. Questo funziona:

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; 

MODIFICA: L'uso di un const iterator_range nel typedef consente di passare un intervallo temporaneo.

+0

Il primo argomento di ifind_first() è Range1T &. Non è standard passare un intervallo temporaneo. –

+0

@ DanielLaügt: 'Range1T' verrà dedotto come' const boost :: iterator_range ', risultante in un riferimento const. Hai un problema nel passare un riferimento const a un temporaneo? –

+0

Non ho visto il const prima di iterator_range. Funziona bene Non sapevo che possiamo fare questo tipo di trucco. Ho imparato qualcosa Grazie. –

0

Qualcosa di simile farà un confronto senza distinzione tra maiuscole e minuscole di stringhe senza modificare nessuna stringa.

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() è effettivamente eseguendo un const_cast: const_cast<char*>(str.c_str()). Dubito molto seriamente che è necessario gettare via const per cercare attraverso la stringa.

Non ho mai utilizzato boost::ifind_first, ma in base allo documentation, la funzione accetta due intervalli. Suppongo che ci sia un modo per creare un intervallo da una stringa? OTOH, mi chiedevo se una corda non fosse una gamma perfetta.

Potrebbe essere utile pubblicare i messaggi di errore completi del compilatore utilizzato.

Problemi correlati