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 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 = make_find_iterator(text, first_finder("ei", is_iequal())) ;
sfi != find_iterator<wstring::iterator>();
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;
ifind_all( findVector, text, L"mir" );
BOOST_FOREACH( iterator_range<wstring::iterator> it, findVector) {
wcout << it << endl;
}
}
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( 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.
#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 dreiBuchstaben("\\w{3}");
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.
#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"ься");
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();
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.
#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