Höhere Programmierung in der Computerlinguistik mit C++ - Vorlesung 9

Zurück

C++ Vorlesung 9 - BOOST_FOREACH

Foreach-Schleife der Boost-Bibliothek.

#include <string>
#include <iostream>
#include <boost/foreach.hpp>

using namespace std;

int main() {
    string hello( "Hello, world!" );
    
    BOOST_FOREACH( char ch, hello ) {
        cout << ch  << endl;
    }

}

C++ Vorlesung 9 - BOOST_FOREACH mit wstrings

Die Schleife funktioniert auch mit wstrings.

#include <string>
#include <iostream>
#include <boost/foreach.hpp>

using namespace std;

int main() {        
        setlocale(LC_ALL, "");
    wstring unicode( L" [ˈjuːnɪkoʊd]" );
    
    BOOST_FOREACH( wchar_t ch, unicode ){
        wcout << ch  << endl;
    }
}

C++ Vorlesung 9 - BOOST_FOREACH mit Containern

Die BOOST_FOREACH-Schleife mit verschiednen Containern. Typedef bachten, da jedes Komma vom Makro als Argumenttrenner gesehen wird.

#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <boost/foreach.hpp>

using namespace std;

int main() {        
        setlocale(LC_ALL, "");
    
        int myArray[] = {10,100,1000};
        vector<int> integerVector;
        map<int,int> integerMap;
             
    BOOST_FOREACH( int i, myArray ) {
                integerVector.push_back(i);
    }

        BOOST_FOREACH(int i, integerVector) {
                wcout << i << endl;
                integerMap[i] = i*i;
        }
        
        /*
                typedef hier notwendig, da boost-Macro hier nicht korrekt greift.
                
                BOOST_FOREACH( map<int,int>::value_type v, integerMap) führt zu Fehler,
                da das Komma zwischen int,int fälschlicherweise als Argument geparst wird.
        */
        
        typedef map<int,int> myIntegerMap;
        
        BOOST_FOREACH(  myIntegerMap::value_type v, integerMap) {
                wcout << v.first << "->" << v.second << endl;
        }
        
        
}

C++ Vorlesung 9 - Boost: String-Algorithmen - find

Der find-Algorithmus aus der Boost Bibliothek.

#include <string>
#include <vector>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main() {
        
        setlocale(LC_ALL,"");
        
        wstring text = L"Die Torheit tritt auf und spricht: Mögen die Menschen in aller Welt von mir sagen, was sie wollen – weiß ich doch, wie übel von der Torheit auch die ärgsten Toren reden -, es bleibt dabei: Mir, ja mir ganz allein und meiner Kraft haben es Götter und Menschen zu danken, wenn sie heiter und frohgemut sind.";

        vector< iterator_range<wstring::iterator> > findVector;
        find_iterator<wstring::iterator> sfi;
        
        for(
                // sfi (String find iterator) auf erstes auftreten von de setzen
                sfi = make_find_iterator(text, first_finder("ei", is_iequal())) ;
                // Solange nicht leer
                sfi != find_iterator<wstring::iterator>();
                // Auf nächste Position
                sfi++
        ) { 
                wcout << copy_range<wstring>(*sfi) << endl;
        }
}

C++ Vorlesung 9 - Boost: String-Algorithmen - find_all / ifind_all

Alle vorkommen in einem String finden. Bei den im Vector gespeicherten Elementen handelt es sich um IteratorRanges, nicht um Strings. Zwei Geschmacksrichtungen: find_all (case Sensitive), ifind_all (case insensitive)

#include <string>
#include <vector>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;


int main() {
        
        setlocale(LC_ALL,"");
        
        wstring text = L"Die Torheit tritt auf und spricht: Mögen die Menschen in aller Welt von mir sagen, was sie wollen – weiß ich doch, wie übel von der Torheit auch die ärgsten Toren reden -, es bleibt dabei: Mir, ja mir ganz allein und meiner Kraft haben es Götter und Menschen zu danken, wenn sie heiter und frohgemut sind.";

        vector< iterator_range<wstring::iterator> > findVector;
        
        /*find_all( wohinSpeichern, woSuchen, "Was suchen" ) case sensitive*/
//         find_all( findVector, text, L"mir" )
/*ifind_all( wohinSpeichern, woSuchen, "Was suchen" ) Cases insensitive*/
        ifind_all( findVector, text, L"mir" );
        
        /*  iterator_range als Rückgabetyp , mit BOOST_FOREACH */
        BOOST_FOREACH( iterator_range<wstring::iterator> it, findVector) {
                wcout << it << endl;
                // cout << it << endl; // Führt zu interessantem Ergebnis
        }
}

C++ Vorlesung 9 - Boost: String-Algorithmen - split

Boost-Bibliothek. Verwendung des split-Algorithmus. Rückgabewert hier sind Strings.

#include <string>
#include <vector>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main() {
        
        setlocale(LC_ALL,"");
        
        wstring text = L"Die Torheit tritt auf und spricht: Mögen die Menschen in aller Welt von mir sagen, was sie wollen – weiß ich doch, wie übel von der Torheit auch die ärgsten Toren reden -, es bleibt dabei: Mir, ja mir ganz allein und meiner Kraft haben es Götter und Menschen zu danken, wenn sie heiter und frohgemut sind.";

        vector<wstring> words;
        
        /*split( wohinSpeichern, woSuchen, "an was splitten" )*/
        split( words, text, is_any_of(L" ,.:"), token_compress_on );
        
        BOOST_FOREACH( wstring word, words) {
                wcout << word << endl;
        }
}

C++ Vorlesung 9 - Boost: unordered_map

Verwendung des Boost-Containers "unordered_map".

#include <boost/unordered_map.hpp>
#include <boost/foreach.hpp>
#include <iostream>

using namespace std;
using namespace boost;

typedef unordered_map<int,int> hash_map;

int main() {
        
        hash_map myHash;
        int integers[] = {1,2,3,4,5,6};
        
        BOOST_FOREACH(int x , integers) {
                myHash[x] = x * x;
        }
        
        BOOST_FOREACH( hash_map::value_type i , myHash) {
                cout << i.first << "->" << i.second << endl;
        }
        


}

C++ Vorlesung 9 - Boost Regex: regex_match

Matchen mit regulären Ausdrücken. Bei regex_match muss ein exakter match vorliegen.

/*
        Regex-match.
        Testen ob ein regulärer Ausdruck den String matcht.
        Exakter match.
*/

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/regex.hpp>

using namespace std;
using namespace boost;
int main() {        
        string namen[] = {"Leon","Lucas","Ben","Finn","Jonas","Paul","Luis","Maximilian","Luca","Felix","Tom"};
        
        // entspricht regex dreiBuchstaben("\\w\\w\\w" , boost::regex::perl)
        // alternative regex dreiBuchstaben("\\w\\w\\w");
        regex dreiBuchstaben("\\w{3}");
        //regex beginntMitL("^L"); würde nicht matchen, da submatch
        regex beginntMitL("^L.*");
        
        
        BOOST_FOREACH( string name, namen) {
                
                if ( regex_match(name,dreiBuchstaben ) ) {
                        cout << "Name: " << name <<  " hat drei Buchstaben." << endl;
                }
                if ( regex_match(name,beginntMitL ) ) {
                        cout << "Name: " << name <<  " beginnt mit L." << endl;
                }
                
        }
}

C++ Vorlesung 9 - Boost Regex: regex_replace

Teile eines Strings anhand regulärer Ausdrücke ersetzen mit Boost regex_match.

/*
        Regex-replace.
        Teile eines Strings per Regex ersetzen.
        Exakter match.
*/

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/regex.hpp>

using namespace std;
using namespace boost;
int main() {        
        string namen[] = {"Leon","Lucas","Ben","Finn","Jonas","Paul","Luis","Maximilian","Luca","Felix","Tom"};
        
        regex vierBuchstaben("(\\b\\w{4})\\b");
        regex anfangsUndEndbuchstabe("^(\\w)\\w+(\\w)$");
        
        regex stringEnde("$");
        
        
        BOOST_FOREACH( string name, namen) {
                cout << "Name:" << name << " -> ";
                cout << regex_replace(name,vierBuchstaben,"$1i") << endl;
                cout << regex_replace(name,anfangsUndEndbuchstabe,"$& -> $1#$2") << endl;
        }
        
}

C++ Vorlesung 9 - Boost Regex:regex_search mit wstrings Unicode

Boost-Regex mit wstrings und Unicode. Beachten: Im Standard matcht /\w/ nicht auf alle Unicode-Word-Characters.

#include <fstream>
#include <iostream>
#include <locale>
#include <string>
#include <boost/regex.hpp>

using namespace std;
using namespace boost;

void search_in_wstring(wregex,wstring);

int main() {
        setlocale(LC_ALL,"");
    locale unicode("de_DE.utf-8");
        
        wstring russian = L"Russian\nЕвропа, Программное обеспечение + Интернет:\nUnicode в глобальных масштабах\nЗарегистрируйтесь сейчас на Десятую Международную Конференцию по Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. Конференция соберет широкий круг экспертов по вопросам глобального Интернета и Unicode, локализации и интернационализации, воплощению и применению Unicode в различных операционных системах и программных приложениях, шрифтах, верстке и многоязычных компьютерных системах.\nКогда мир желает общаться, он общается на Unicode";

        wstring chinese = L"Chinese (Simplified) 欧洲,软件+互联网 用统一码 (Unicode) 走遍世界 将于1997年 3 月10日-12日在德国 Mainz 市举行的第十届统一码国际研讨会现在开始注册。 本次会议将汇集各方面的专家。 涉及的领域包括: 国际互联网和统一码 ,国际化和本地化 ,统一码在操作系统和应用软件中的实现 ,字型 ,文本格式以及多文种计算等。 当世界需要沟通时,请用Unicode!";
        
        wregex words(L"\\b(\\w+)\\b");
        wregex nonWhitespace(L"\\S+");
        wregex russianCharacters(L"ься");
        
        // www match nur [A-Za-z0-9]
        search_in_wstring(words, chinese);
        search_in_wstring(nonWhitespace, russian);
        search_in_wstring(russianCharacters, russian);
}

void search_in_wstring(wregex re, wstring line) {
        wsmatch aMatch;
        
        wstring::const_iterator startOfSearch = line.begin();
        wstring::const_iterator endOfSearch = line.end();
        //regex_search(Startposition, Endposition, MatchVariable, Regulärer Ausdruck)
        while ( regex_search(startOfSearch, endOfSearch, aMatch, re) ) {
                wcout << L"Matched: " << aMatch[0] << endl;
                startOfSearch = aMatch[0].second;
        }
        wcout << endl << endl;
}

C++ Vorlesung 9 - Boost Regex: regex_iterator

Boost-Regex: String mit einem regex_iterator druchlaufen.

/*
        Regex-Iterator.
        Vorkommen innerhalb eines Strings durchlaufen.
*/

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/regex.hpp>

using namespace std;
using namespace boost;

int main() {        
        wstring text = L"German Europa, Software + das Internet: International mit Unicode Melden Sie sich jetzt für die 10. Internationale Unicode Konferenz an, die in der Zeit vom 10.-12. März 1997 in Mainz stattfinden wird. Die Konferenz ist ein Treffpunkt für Betriebsexperten aus den Bereichen globales Internet und Unicode, Internationalisierung und Lokalisierung, die Implementierung von Unicode in Betriebssystemen und Programmen, sowie für Schriftarten, Textlayout und mehrsprachige Computeranwendungen. Wenn die Welt miteinander spricht, spricht sie Unicode";
        
        wregex re(L"[A-ZÖÄÜ]\\S+");
        
        regex_token_iterator<wstring::const_iterator > aMatch( text.begin(), text.end(), re) ;
    regex_token_iterator<wstring::const_iterator> noMatch ;
        
        while (aMatch != noMatch ) {
                wcout << * aMatch << endl;
                aMatch++;
        }
        
        

}
Zurück