Page 1
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Politechnika Łódzka, ul. Żeromskiego 116, 90-924 Łódź, tel. (042) 631 28 83www.kapitalludzki.p.lodz.pl
Zaawansowane programowanie w języku C++Biblioteka standardowa
Prezentacja jest współfinansowana przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego w projekcie pt.
„Innowacyjna dydaktyka bez ograniczeń - zintegrowany rozwój Politechniki Łódzkiej -
zarządzanie Uczelnią, nowoczesna oferta edukacyjna i wzmacniania zdolności do zatrudniania osób niepełnosprawnych”
Prezentacja dystrybuowana jest bezpłatnie
Zaawansowane programowanie w języku C++Biblioteka standardowa
Prezentacja jest współfinansowana przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego w projekcie pt.
„Innowacyjna dydaktyka bez ograniczeń - zintegrowany rozwój Politechniki Łódzkiej -
zarządzanie Uczelnią, nowoczesna oferta edukacyjna i wzmacniania zdolności do zatrudniania osób niepełnosprawnych”
Prezentacja dystrybuowana jest bezpłatnie
Page 2
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
2Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Biblioteka standardowaBiblioteka standardowa
• Po co definiować i standaryzować bibliotekę języka programowania?
• Składniki biblioteki standardowej języka C++:– Łańcuch znaków
– Realizacja funkcji wejścia-wyjścia
– Kontenery (struktury danych)
– Algorytmy
– Wspomaganie operacji numerycznych
– Wsparcie dla międzynarodowych wersji programów
Page 3
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
3Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Przestrzeń nazw stdPrzestrzeń nazw std
• Biblioteka standardowa języka C++ została zdefiniowana w przestrzeni nazw std
std::cout << "hello" << std::endl;
using std::cout;
using std::endl;
cout << "hello" << endl;
using namespace std;
cout << "hello" << endl;
Page 4
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
4Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Pliki nagłówkowePliki nagłówkowe
• Biblioteka standardowa języka C w bibliotece języka C++ (wybrane pliki):
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
• Biblioteka standardowa języka C++ (wybrane pliki):
#include<string>
#include<new>
#include<vector>
#include<complex>
Page 5
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
5Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Ciągi znaków - napisyCiągi znaków - napisy
• Ciągi znaków języka C:
#include<string.h>
char str[100];
strncpy( str, "hello", 100 );
• Ciągi znaków języka C++:
#include<string>
std::string str;
str = "hello";
Page 6
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
6Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Ciąg znaków języka CCiąg znaków języka C
#include<string.h>
char str[100];
strncpy( str, "hello", 100 );
H E L LH O \0 ? ?
0 99
strlen( str );
sizeof( str ) / sizeof( str[0] )
memcpy, strcpy, strlen
Page 7
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
7Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Ciąg znaków języka C++Ciąg znaków języka C++
• Klasa std::string
• Podstawowe metody klasy std::string– empty()
– size(), length()
– at(), operator[]
– clear(), erase()
– find()
– swap()
– substr()
– append()
– c_str()
Page 8
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
8Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Klasa std::string a ciągi znaków języka C
Klasa std::string: Ciągi znaków języka C:
strcpy( a, b ) a = b
strcmp( a, b ) a == b
strcat( a, b ) a += b
strlen( a ) a.size()
strstr( a, b ) a.find( b )
Page 9
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
9Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Klasy wejścia-wyjścia języka C++
• Nagłówek iostream– Nagłówki istream, ostrem
– Obiekty: cout, cin, cerr, clog
• Nagłówek fstream– Nagłówki ifstream, ofstream
Page 10
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
10Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Omówienie biblioteki standardowejOmówienie biblioteki standardowej
• C++ Reference:– http://www.cplusplus.com/reference/
– http://www.cppreference.com/wiki/
– http://gcc.gnu.org/onlinedocs/libstdc++/
– http://en.wikipedia.org/wiki/C%2B%2B_standard_library
– http://www.parashift.com/c++-faq-lite/containers.html
– http://www.parashift.com/c++-faq-lite/class-libraries.html
Page 11
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
11Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Porównanie podstawowych kontenerówPorównanie podstawowych kontenerów
• Wektor (std::vector)– Model tablicy dynamicznej
– Swobodny dostęp do elementów
– Kolejka typu LIFO
• Kolejka o dwóch końcach (std::deque)– Model tablicy dynamicznej „otwartej” z obydwu końców
– Kolejka typu FIFO
• Lista (std::list)– Model listy dwukierunkowej
– Wstawianie i usuwanie elementów jest szybkie i stałe w czasie
– Brak swobodnego dostępu do elementów – konieczna iteracja
Page 12
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
12Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
• Wektor najczęściej implementowany jest jako tablica dynaczmina:
• Oczekuje się, że będzie spełnione wyrażenie:&v[ i ] == &v[ 0 ] + i
• Plusy/minusy?
Wektor – model pamięciWektor – model pamięci
Page 13
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
13Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
• Implementowana zazwyczaj jako grupa pojedynczych bloków
• Plusy/minusy?
Kolejka – model pamięciKolejka – model pamięci
Page 14
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
14Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
• Plusy/minusy?
Lista – model pamięciLista – model pamięci
Page 15
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
15Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Iteratory
• W bibliotece standardowej C++ iterator jest:– „Inteligentnym” wskaźnikiem
• Implementuje operację de-referencji (*)
• Implementuje operację inkrementacji (++)
– Pozwala na dostęp do elementów danego kontenera bez znajomości jego budowy
– Iterator jest obiektem, który wskazuje na inny obiekt
• Kontenery implementują:– Metody: begin(), end(), rbegin(), rend()
– Obiekty: iterator, reverse_iterator, const_iterator, const_reverse_terator
Page 16
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
16Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Testowane operacjeTestowane operacje
• Utworzenia kontenera i wypełnienia go obiektami testowymi– Domyślny konstruktor + metoda push_back
• Sortowania obiektów przechowywanych w kontenerze– Funkcja sort() z biblioteki algorithm
• Dostępu do obiektów przechowywanych w kontenerze w trybie do odczytu– Iterator const_iterator
• Dodawanie zbioru obiektów do istniejącego kontenera– Metoda insert()
Page 17
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
17Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Utworzenie kontenera – procedura testowaUtworzenie kontenera – procedura testowa
template<class T> void con_create(unsigned int size) {
struct timeval start, end; T con; gettimeofday(&start, NULL); for (unsigned int i=0; i<size; ++i) {
con.push_back(string("test")); } gettimeofday(&end, NULL); unsigned long t = (end.tv_sec*1000000 + end.tv_usec)
(start.tv_sec*1000000 + start.tv_usec); cout << size << "\t" << t << endl;
}
Page 18
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
18Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Utworzenie kontenera – zestawienie wynikówUtworzenie kontenera – zestawienie wyników
Liczba elementów:
vector [us]: deque [us]: list [us]:
10 35 12 15
100 34 24 36
1000 280 229 349
10000 3022 2174 3682
100000 29728 21810 37931
1000000 295685 219169 380891
10000000 3150320 2402150 3774683
Page 19
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
19Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Utworzenie kontenera – graficzna prezentacjaUtworzenie kontenera – graficzna prezentacja
10 100 1000 10000 100000 1000000 10000000
1
10
100
1000
10000
100000
1000000
10000000
Dodawanie elementów
vectordequelist
Liczba elementów [n]
Cza
s [u
s]
Page 20
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
20Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Sortowanie kontenera – procedura testowaSortowanie kontenera – procedura testowa
template<class T> void con_sort(unsigned int size) {
struct timeval start, end; T con; for (unsigned int i=0; i<size; ++i) {
con.push_back( string(lexical_cast<string>(size/(i+1))));
} gettimeofday(&start, NULL); sort(con.begin(), con.end()); gettimeofday(&end, NULL); unsigned long t = (end.tv_sec*1000000 + end.tv_usec)
(start.tv_sec*1000000 + start.tv_usec); cout << size << "\t" << t << endl;
}
Page 21
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
21Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Sortowanie listy – procedura testowaSortowanie listy – procedura testowa
template<> void con_sort<list<string> >(unsigned int size) {
struct timeval start, end; list<string> con; for (unsigned int i=0; i<size; ++i) {
con.push_back( string(lexical_cast<string>(size/(i+1))));
} gettimeofday(&start, NULL); con.sort(); gettimeofday(&end, NULL); unsigned long t = (end.tv_sec*1000000 + end.tv_usec)
(start.tv_sec*1000000 + start.tv_usec); cout << size << "\t" << t << endl;
}
Page 22
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
22Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Sortowanie kontenera – zestawienie wynikówSortowanie kontenera – zestawienie wyników
Liczba elementów:
vector [us]: deque [us]: list [us]:
10 13 11 24
100 57 78 70
1000 664 823 684
10000 8882 11167 8185
100000 108732 138821 93053
1000000 1302338 1675550 1001823
10000000 15797412 20170507 11177318
Page 23
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
23Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Sortowanie kontenera – graficzna prezentacjaSortowanie kontenera – graficzna prezentacja
10 100 1000 10000 100000 1000000 10000000
1
10
100
1000
10000
100000
1000000
10000000
100000000
Sortowanie elementów
vectordequelist
Liczba elementów [n]
Cza
s [u
s]
Page 24
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
24Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dostęp do elementów – procedura testowaDostęp do elementów – procedura testowa
template<class T> void con_access_read(unsigned int size) {
struct timeval start, end; T con(size); for (unsigned int i=0; i<size; ++i)
con.push_back(string("test")); gettimeofday(&start, NULL); typename T::const_iterator i; for (i=con.begin(); i!=con.end(); ++i) {
string buf = *i; } gettimeofday(&end, NULL); unsigned long t = (end.tv_sec*1000000 + end.tv_usec)
(start.tv_sec*1000000 + start.tv_usec); cout << size << "\t" << t << endl;
}
Page 25
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
25Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dostęp do elementów – zestawienie wynikówDostęp do elementów – zestawienie wyników
Liczba elementów:
vector [us]: deque [us]: list [us]:
10 3 3 3
100 12 11 12
1000 95 94 101
10000 933 915 1012
100000 9567 9538 10782
1000000 95766 95028 109020
10000000 950301 949429 1109043
Page 26
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
26Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dostęp do elementów – graficzna prezentacjaDostęp do elementów – graficzna prezentacja
10 100 1000 10000 100000 1000000 10000000
1
10
100
1000
10000
100000
1000000
10000000
Odczyt elementów
vectordequelist
Liczba elementów [n]
Cza
s [u
s]
Page 27
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
27Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dodawanie elementów – procedura testowaDodawanie elementów – procedura testowa
template<class T> void con_insert(unsigned int size) {
struct timeval start, end; T con(size); for (unsigned int i=0; i<size; ++i) {
con.push_back(string("test")); } string buf = "test"; gettimeofday(&start, NULL); typename T::iterator i=con.begin(); ++i; ++i; con.insert(i, 10, buf); gettimeofday(&end, NULL); unsigned long t = (end.tv_sec*1000000 + end.tv_usec)
(start.tv_sec*1000000 + start.tv_usec); cout << size << "\t" << t << endl;
}
Page 28
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
28Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dodawanie elementów – zestawienie wynikówDodawanie elementów – zestawienie wyników
Liczba elementów:
vector [us]: deque [us]: list [us]:
10 4 6 4
100 12 4 4
1000 75 3 3
10000 773 4 4
100000 8147 10 7
1000000 81969 11 7
10000000 810680 11 7
Page 29
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
29Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Dodawanie elementów – graficzna prezentacjaDodawanie elementów – graficzna prezentacja
10 100 1000 10000 100000 1000000 10000000
1
10
100
1000
10000
100000
1000000
Wstawianie elementów
vectordequelist
Liczba elementów [n]
Cza
s [u
s]
Page 30
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
30Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
WnioskiWnioski
Page 31
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
31Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
Pozostałe przydatne kontenery
• Kontener std::set
• Kontener std::map
Page 32
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
32Bartłomiej Świercz – Katedra Mikroelektroniki i Technik Informatycznych
NarzędziaNarzędzia
• Plik nagłówkowy utlity:– pair
– make_pair
• Plik nagłówkowy memory:– auto_ptr
• Plik nagłówkowy limits:– numeric_limits
Page 33
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Politechnika Łódzka, ul. Żeromskiego 116, 90-924 Łódź, tel. (042) 631 28 83www.kapitalludzki.p.lodz.pl
Zaawansowane programowanie w języku C++Biblioteka standardowa
Prezentacja jest współfinansowana przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego w projekcie pt.
„Innowacyjna dydaktyka bez ograniczeń - zintegrowany rozwój Politechniki Łódzkiej -
zarządzanie Uczelnią, nowoczesna oferta edukacyjna i wzmacniania zdolności do zatrudniania osób niepełnosprawnych”
Prezentacja dystrybuowana jest bezpłatnie
Zaawansowane programowanie w języku C++Biblioteka standardowa
Prezentacja jest współfinansowana przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego w projekcie pt.
„Innowacyjna dydaktyka bez ograniczeń - zintegrowany rozwój Politechniki Łódzkiej -
zarządzanie Uczelnią, nowoczesna oferta edukacyjna i wzmacniania zdolności do zatrudniania osób niepełnosprawnych”
Prezentacja dystrybuowana jest bezpłatnie