66
Библиотека стандардних шаблона (Standard template library – STL)

Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Библиотека стандардних шаблона(Standard template library – STL)

Page 2: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Уобичајени задаци које обављамо у програмирању

• Смештање података у контејнере

• Организовање података• за испис• за брз приступ

• Добављање вредности• по индексу („дај ми n-ти елемент“)

• по вредности („дај ми први елемент чија је вредност 67“)

• по особини („дај ми све елементе чија вредност је мања од 67“)

• Додавање података

• Уклањање података

• Уређивање и претраживање

• Једноставне нумеричке операције

2

Page 3: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 3

Page 4: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Неутрални елемент

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s {0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 4

Page 5: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Сабирање

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 5

Page 6: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Почетак

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 6

Page 7: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Није крај

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 7

Page 8: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Добави вредност

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 8

Page 9: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Добави следећи елемент

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 9

Page 10: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

// псеудо код

data_type sum(data) {

data_type s = 0;

while (not at end) {

s = s + get value;

get next data element;

}

return s;

}

• Потребне су нам две операције над типом елемената:• Постављање на неутралну вредност• Сабирање

10

Page 11: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

// псеудо код

data_type sum(data) {

data_type s = 0;

while (not at end) {

s = s + get value;

get next data element;

}

return s;

}

• Потребне су нам три операције над структуром података:• Није крај• Добави вредност• Добави следећи елемент

• Плус, почетак (имплицитно део „добави вредност“ и саме структуре подата) 11

Page 12: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int n)

{

double s{0.0};

for (int i = 0; i < n; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first)

{

int s{0};

while (first != nullptr) {

s += first->data;

first = first->next;

}

return s;

} 12

double r1 = sum(niz, N);

int r2 = sum(head);

Page 13: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last)

{

double s{0.0};

for (int i = first; i < last; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last)

{

int s{0};

while (first != last) {

s += first->data;

first = first->next;

}

return s;

} 13

double r1 = sum(niz, 0, N);

int r2 = sum(head, nullptr);

Page 14: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double start)

{

double s{start};

for (int i = first; i < last; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int start)

{

int s{start};

while (first != last) {

s += first->data;

first = first->next;

}

return s;

} 14

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

Page 15: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double s)

{

for (int i = first; i < last; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s)

{

while (first != last) {

s += first->data;

first = first->next;

}

return s;

}

15

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

Page 16: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double s)

{

for (int i = first; i < last; ++i) s = s + array[i];

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s)

{

while (first != last) {

s = s + first->data;

first = first->next;

}

return s;

}

16

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

Page 17: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double s) {

while (first < last) {

s = s + array[first];

++first;

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + first->data;

first = first->next;

}

return s;

}17

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

Page 18: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double s) {

while (first != last) {

s = s + array[first];

++first;

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + first->data;

first = first->next;

}

return s;

}18

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

Page 19: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double array[], int first, int last, double s) {

while (first != last) {

s = s + array[first];

toNext(first);

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + first->data;

toNext(first);

}

return s;

}19

double r1 = sum(niz, 0, N, 0);

int r2 = sum(head, nullptr, 0.0);

void toNext(int& x) { ++x; }

void toNext(Node*& x) { x = x->next; }

Page 20: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double* first, double* last, double s) {

while (first != last) {

s = s + *first;

toNext(first);

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + first->data;

toNext(first);

}

return s;

}20

double r1 = sum(&niz[0], &niz[N], 0);

int r2 = sum(head, nullptr, 0.0);

void toNext(double*& x) { ++x; }

void toNext(Node*& x) { x = x->next; }

Page 21: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double* first, double* last, double s) {

while (first != last) {

s = s + getVal(first);

toNext(first);

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + getVal(first);

toNext(first);

}

return s;

}21

double r1 = sum(&niz[0], &niz[N], 0);

int r2 = sum(head, nullptr, 0.0);

void toNext(double*& x) { ++x; }

void toNext(Node*& x) { x = x->next; }

double getVal(double* x) { return *x; }

int getVal(Node* x) { return x->data; }

Page 22: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double* first, double* last, double s) {

while (first != last) {

s = s + getVal(first);

toNext(first);

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + getVal(first);

toNext(first);

}

return s;

}22

double r1 = sum(&niz[0], &niz[N], 0);

int r2 = sum(head, (Node*)nullptr,

0.0);

void toNext(double*& x) { ++x; }

void toNext(Node*& x) { x = x->next; }

double getVal(double* x) { return *x; }

int getVal(Node* x) { return x->data; }

template<class Iter, class T>T sum(Iter first, Iter last, T s) {

while (first != last) {s = s + getVal(first);toNext(first);

}return s;

}

Page 23: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double* first, double* last, double s) {

while (first != last) {

s = s + *first;

++first;

}

return s;

}

struct Node { Node* next; int data; };

int sum(Node* first, Node* last, int s) {

while (first != last) {

s = s + getVal(first);

toNext(first);

}

return s;

}23

double r1 = sum(&niz[0], &niz[N], 0);

int r2 = sum(head, (Node*)nullptr,

0.0);

void toNext(double*& x) { ++x; }

void toNext(Node*& x) { x = x->next; }

double getVal(double* x) { return *x; }

int getVal(Node* x) { return x->data; }

Page 24: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

double sum(double* first, double* last, double s) {

while (first != last) {

s = s + *first;

++first;

}

return s;

}

struct Node { Node* next; int data; };

struct NodeIter { Node* t; ... };

int sum(NodeIter first, NodeIter last, int s) {

while (first != last) {

s = s + *first;

++first;

}

return s;

}24

double r1 = sum(&niz[0], &niz[N], 0);

int r2 = sum(head, NodeIter(nullptr),

0.0);

NodeIter& operator++(NodeIter& x) {

x->t = x->t->next; return x; }

int operator*(NodeIter x) {

return x->t->data; }

bool operator!=(NodeIter x, NodeIter y) {

return x->t != t->t;

}

Page 25: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Подизање алгоритма

template<class Iter, class T>

T sum(Iter first, Iter last, T s)

{

while (first != last) {

s = s + *first;

++first;

}

return s;

}

• Ради за обичне низове:int a[] = { 1,2,3,4,5,6,7,8 };

double d = 0;

d = sum(a, a + n, d);

25

Page 26: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

STL

• Осмишљено од стране Александра Степанова (енгл. Alexander Stepanov; рус. Александр Степанов).Прочитати: www.stlport.org/resources/StepanovUSA.html

• Циљ: Најопштија, најефикаснија, најфлексибилнијарепрезентација концепата (идеја и алгоритама)

• Представити раздвојене концепте у раздвојеном коду• Слободно комбиновати концепте кад год је смислено

26

Page 27: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Основни модел

• Алгоритмиsort, find, search, copy, …

• Контејнериvector, list, map, unordered_map, …

27

итератори

– Алгоритми баратају подацима, али их се не тичу контејнери

– Контејнери складиште податке, али их се не тичу алгоритми

– Веза између алгоритама и контејнера су итератори:

• Сваки контејнер има своју врсту итератора, али сви они имају исту (врло сличну) спрегу

Page 28: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

STL

• Стандардна библиотека шаблона је стандарднаЦе++ библиотека са ~15 контејнера и преко 60 алгоритама

• Постоје и друге библиотеке које су направљене у том стилу:

• Boost.org, TBB, Microsoft, SGI, …

28

Page 29: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

STL

• Ако знате основне концепте и неколико примера, онда лако можете користити и остатак библиотеке.

• Документација• Cppreference

• https://en.cppreference.com/w/cpp/container

• https://en.cppreference.com/w/cpp/iterator

• https://en.cppreference.com/w/cpp/algorithm

• SGI• http://www.sgi.com/tech/stl/

• Dinkumware• http://www.dinkumware.com/refxcpp.html

• Rogue Wave• http://www.roguewave.com/support/docs/sourcepro/stdlibug/index.html

• Формална спецификација у Це++ стандарду:• Appendix B 29

Page 30: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Основни модел

• Пар итератора одређује секвенцу• Почетак (beginning) – показује на први елемент (ако га уопште има)• Крај (end) – показује иза последњег елемента

30

begin: end:

• Итератор је тип који подржава итераторске операције:• == (и !=) Да ли итератори показују на исти елемент? (за одређивање краја)

• * (унарно) Добави вредност

• ++ (префиксно и постфиксно) Пређи на следећи елемент

• Итератори могу подржавати још неке операције, нпр.:

--, +, [ ] ...

Page 31: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Контејнери(складиште секвенцу података на различите начине)

• vector

• list(двоструко повезана)

• set(у облику бинарног

стабла)

31

0 1 2 3

0 1

10

6

2

5

7

3 4

2

Page 32: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Пример алгоритма: find()

// Нађи први елемент који је једнак задатом

template<class In, class T>

In find(In first, In last, const T& val)

{

while (first != last && *first != val) ++first;

return first;

}

void f(vector<int>& v, int x)

{

vector<int>::iterator p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

}

32

begin: end:

Page 33: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

find()

void f(vector<int>& v, int x)

{

vector<int>::iterator p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

}

void f(list<string>& v, string x)

{

list<string>::iterator p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

}

void f(set<double>& v, double x)

{

set<double>::iterator p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

} 33

Page 34: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

find()

void f(vector<int>& v, int x)

{

auto p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

}

void f(list<string>& v, string x)

{

auto p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

}

void f(set<double>& v, double x)

{

auto p = find(v.begin(), v.end(), x);

if (p != v.end()) { /* нашли смо x */ }

// …

} 34

Page 35: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Алгоритми и итератори

• Итератор показује на елемент у секвенци

• Крај секвенце је отворен, тј. итератор на крају секвенце показује иза последњег елемента

• Згодно за елегантно представљање празне секвенце

• Крајњи итератор целог контејнера показује иза последњег елемента• Тај итератор се не може дереференцирати

35

0 1 2 3

end:

Празна секвенца:

begin: end:some

iterator:

Page 36: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Пример алгоритма: find_if()

• Нађи први елемент који испуњава неки критеријум (предикат)

• Предикат прима један аргумент и враћа bool тип

template<class In, class Pred>

In find_if(In first, In last, Pred pred)

{

while (first != last && !pred(*first)) ++first;

return first;

}

void f(vector<int>& v)

{

vector<int>::iterator p = find_if(v.begin(), v.end(), odd);

if (p != v.end()) { /* нашли смо први непарни елемент */ }

// …

}

36

Предикат

Page 37: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Предикати

• Пример:• Функција (сетимо се исцртавања функција)

bool odd(int i) { return i % 2; }

odd(7);

• Функцијски објекат (функтор)

struct Odd {

bool operator()(int i) const { return i % 2; }

};

Odd odd;

odd(7);

37

Page 38: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Предикати

• Пример:• Функција (сетимо се исцртавања функција)

bool odd(int i) { return i % 2; }

odd(7);

find_if(..., ..., odd);

// шта је тип Pred?

• Функцијски објекат (функтор)

struct Odd {

bool operator()(int i) const { return i % 2; }

};

Odd odd;

odd(7);

find_if(..., ..., odd);

// шта је тип Pred? 38

template<class In, class Pred>In find_if(In first, In last, Pred pred)...

Page 39: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Предикати

• Пример:• Функција (сетимо се исцртавања функција)

bool odd(int i) { return i % 2; }

odd(7);

find_if(..., ..., odd);

// шта је тип Pred? bool ()(int);

• Функцијски објекат (функтор)

struct Odd {

bool operator()(int i) const { return i % 2; }

};

Odd odd;

odd(7);

find_if(..., ..., odd);

// шта је тип Pred? Odd 39

template<class In, class Pred>In find_if(In first, In last, Pred pred)...

Page 40: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Предикати

• Пример:• Функција (сетимо се исцртавања функција)

bool even(int i) { return !(i % 2); }

even(7);

find_if(..., ..., even);

// шта је тип Pred? bool ()(int);

• Функцијски објекат (функтор)

struct Even {

bool operator()(int i) const { return !(i % 2); }

};

Even even;

even(7);

find_if(..., ..., even);

// шта је тип Pred? Even 40

template<class In, class Pred>In find_if(In first, In last, Pred pred)...

Page 41: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Функтори наспрам функција• Функтори и класичне функције које се позивају на синтаксно идентичан

начин ипак нису истог типа! Зато се, на пример, не могу прослеђивати истим функцијама...

41

void foo(int x);

void bar(int x);

void apply1(void (*f)(int)) {

... f(elem); ...

}

apply1(foo);

apply1(bar);

apply1(foA); // не може

struct A {

void operator()(int x);

};

struct B {

void operator()(int x);

};

A foA; B foB;

void apply2(A f) {

... f(elem); ...

}

apply2(foA);

apply2(foo); // не може

apply2(foB); // не може

Page 42: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Функтори наспрам функција

template<typename T>

void foo(T func) {

...

func(15);

...

}

void bar1(int x);

void bar2(int x);

struct Bar3 {

void operator()(int x);

};

struct Bar4 {

void operator()(int x);

};

Bar4 bar4;

42

typedef void fType(int);

void foo(fType func) {

... func(15); ...

}

void foo(Bar3 func) {

... func(15); ...

}

void foo(Bar4 func) {

... func(15); ...

}

foo(bar1);

foo(bar2);

foo(Bar3());

foo(bar4);

r1 <- mem[_bar1]

//r1 <- mem[_bar2]

foo_fType:

call r1

foo_Bar3:

call _Bar3_f

foo_Bar4:

call _Bar4_f

...али се могу користити за инстанцирање

истих функцијских шаблона, јер се исто

синтаксно понашају.

Инстанцирање шаблона функторима може

довести до бржег кода, јер компајлер тачно

зна која функција ће се применити. Са

обичним функцијама се не зна да ли је то

bar1 или bar2 или нешто треће, па имамо

индирекцију.

Page 43: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

43

Функтори (из архиве)

int expN_number_of_terms = 6; // супер тајни аргумент функције expN

double expN(double x)

{

return expe(x, expN_number_of_terms);

}

for (int n = 0; n < 50; ++n)

{

ostringstream ss;

ss << "exp approximation; n==" << n ;

win.set_label(ss.str().c_str());

expN_number_of_terms = n; // супер тајни аргумент функције expN

// наредна апроксимација:

Function e(expN, r_min,r_max, orig, 200, x_scale,y_scale);

win.attach(e);

win.wait_for_button();

win.detach(e);

}

Page 44: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

44

struct expN

{

int number_of_terms;

expN(int x) : number_of_terms(x) {}

double operator()(double x) const { return expe(x, number_of_terms); }

};

for (int n = 0; n < 50; ++n)

{

ostringstream ss;

ss << "exp approximation; n==" << n ;

win.set_label(ss.str().c_str());

//expN_number_of_terms = n; // супер тајни аргумент функције expN

// наредна апроксимација:

Function e(expN(n), r_min,r_max, orig, 200, x_scale,y_scale);

win.attach(e);

win.wait_for_button();

win.detach(e);

}

Функтори (из архиве)

Page 45: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Функтори

struct Less_than

{

int val;

Less_than(int& x) : val(x) { }

bool operator()(const int& x) const { return x < val; }

};

p=find_if(v.begin(), v.end(), Less_than(43));

p=find_if(v.begin(), v.end(), Less_than(76));

45

Page 46: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Функтори

template<class T>

struct Less_than

{

T val;

Less_than(T& x) : val(x) { }

bool operator()(const T& x) const { return x < val; }

};

p=find_if(v.begin(), v.end(), Less_than(43));

p=find_if(v.begin(), v.end(), Less_than(76));

q=find_if(ls.begin(), ls.end(), Less_than("perfection"));

46

Page 47: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Функтори

• Да закључимо:

• Зашто функтори?• Без индирекције

• Могу да имају стање

47

Page 48: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритама

struct Record {

string name;

char addr[24];

// …

};

vector<Record> vr;

// …

sort(vr.begin(), vr.end(), Cmp_by_name()); // уреди по имену

sort(vr.begin(), vr.end(), Cmp_by_addr()); // уреди по адреси

48

Page 49: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритама

struct Cmp_by_name {

bool operator()(const Rec& a, const Rec& b) const

{ return a.name < b.name; }

};

struct Cmp_by_addr {

bool operator()(const Rec& a, const Rec& b) const

{ return 0 < strncmp(a.addr, b.addr, 24); }

};

vector<Record> vr;

// …

sort(vr.begin(), vr.end(), Cmp_by_name());

sort(vr.begin(), vr.end(), Cmp_by_addr());

49

Page 50: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритамаЛамбда изрази („функторски литерал“)

struct Cmp_by_name {

bool operator()(const Rec& a, const Rec& b) const

{ return a.name < b.name; }

};

struct Cmp_by_addr {

bool operator()(const Rec& a, const Rec& b) const

{ return 0 < strncmp(a.addr, b.addr, 24); }

};

vector<Record> vr;

// …

sort(vr.begin(), vr.end(), [] (const Rec& a, const Rec& b)

{ return a.name < b.name; } );

sort(vr.begin(), vr.end(), [] (const Rec& a, const Rec& b)

{ return 0 < strncmp(a.addr, b.addr, 24); });

50

Page 51: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритамаЛамбда изрази („функторски литерал“)

void foo(int x);

int a = 5;

int b = 6;

foo(a);

foo(b);

foo(5);

foo(6);

51

??? x = 5;

Тип литерала 5?

Page 52: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритамаЛамбда изрази („функторски литерал“)

void foo(int x);

int a = 5;

int b = 6;

foo(a);

foo(b);

foo(5);

foo(6);

52

int x = 5;

Тип литерала 5? int

Page 53: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритамаЛамбда изрази („функторски литерал“)

void foo(int x);

int a = 5;

int b = 6;

foo(a);

foo(b);

foo(5);

foo(6);

53

int x = 5;

??? y = [] (const Rec& a, const Rec& b)

{ return a.name < b.name; };

Тип литерала 5? int

Тип овог литерала?

Page 54: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Параметризација алгоритамаЛамбда изрази („функторски литерал“)

void foo(int x);

int a = 5;

int b = 6;

foo(a);

foo(b);

foo(5);

foo(6);

54

int x = 5;

auto y = [] (const Rec& a, const Rec& b)

{ return a.name < b.name; };

Тип литерала 5? int

Тип овог литерала?

Page 55: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Гледаћете у следећој сезони... (у предмету Паралелно програмирање - TBB)

class ApplyFoo {

vector<float>& m_a;

public:

void operator()(const blocked_range<size_t>& r) const {

for (size_t i = r.begin(); i != r.end(); ++i)

Foo(m_a[i]);

}

ApplyFoo(vector<float>& a) : m_a(a) {}

};

vector<float> data;

parallel_for(blocked_range<size_t>(0, n), ApplyFoo(data));

55

Page 56: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Гледаћете у следећој сезони... (у предмету Паралелно програмирање - TBB)

class ApplyFoo {

vector<float>& m_a;

public:

void operator()(const blocked_range<size_t>& r) const {

for (size_t i = r.begin(); i != r.end(); ++i)

Foo(m_a[i]);

}

ApplyFoo(vector<float>& a) : m_a(a) {}

};

vector<float> data;

parallel_for(blocked_range<size_t>(0, n), [data](const blocked_range<size_t>& r) {

for (size_t i = r.begin(); i != r.end(); ++i)

Foo(data[i]);

});

56

Page 57: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

vector

template<class T> class vector {

T* elements;

// …

using value_type = T;

using iterator = ???;

using const_iterator = ???;

iterator begin();

const_iterator begin() const;

iterator end();

const_iterator end() const;

iterator erase(iterator p);

iterator insert(iterator p, const value_type& v);

};

57

Page 58: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

insert() код вектораvector<int>::iterator p = v.begin(); ++p; ++p; ++p;

vector<int>::iterator q = p; ++q;

58

6

0 21 3 4 5

v:

p = v.insert(p, 99);

p:

7

0 21 99 3 4

v:p:

5

q:

q:

Напомена: q није валидно након insert()

Напомена: Неки елементи су се померили (могли су се сви померити)

Page 59: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

erase() код вектора

59

p = v.erase(p);

7

0 21 99 3 4

v:p:

5

q:

6

0 21 3 4 5

v:p: q:

Напомена: претходно постављени итератори нису валидни након erase()

Напомена: Неки елементи су се померили (могли су се сви померити)

Page 60: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

list

template<class T> class list {

Link* elements;

// …

using value_type = T;

using iterator = ???;

using const_iterator = ???;

iterator begin();

const_iterator begin() const;

iterator end();

const_iterator end() const;

iterator erase(iterator p);

iterator insert(iterator p, const value_type& v);

};

60

T value

Link* pre

Link* post

Link:

Page 61: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

insert() код листеlist<int>::iterator p = v.begin(); ++p; ++p; ++p;

list<int>::iterator q = p; ++q;

61

7

0 21 3 4 5

v:

p = v.insert(p, 99);

p:

99

6

0 21 3 4 5

v: p: q:

q:

Напомена: q је и даље валидно

Напомена: Нема померања елемената

Page 62: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

erase() код листе

62

7

0 21 3 4 5

v:

p = v.erase(p);

p:

99

6

0 21 3 4 5

v:p:

q:

q:

Напомена: q је и даље валидно

Напомена: Нема померања елемената

Page 63: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Начини проласка кроз векторfor (int i = 0; i < v.size(); ++i) // зашто баш int?

… // v[i]

for (vector<T>::size_type i = 0; i < v.size(); ++i) // дуже, али увек исправно

… // v[i]

for (vector<T>::iterator p = v.begin(); p != v.end(); ++p)

… // *p

63

Page 64: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Начини проласка кроз векторfor (int i = 0; i < v.size(); ++i) // зашто баш int?

… // v[i]

for (vector<T>::size_type i = 0; i < v.size(); ++i) // дуже, али увек исправно

… // v[i]

for (vector<T>::iterator p = v.begin(); p != v.end(); ++p)

… // *p

for (vector<T>::value_type x : v) // нпр.: for(int x : v), ако је vector<int>

… // x

for (auto x : v) // или for (auto& x : v)

… // x

• Оваква фор петља је згодна да се користи:• када хоћемо да прођемо кроз цео контејнер, од почетка до краја• када нам није важна позиција елемента• када нам је довољно да обрађујемо по један елемент

64

Page 65: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Вектор наспрам листе

• Подразумевано користите vector

• Ако желите да померате елементе, користите list

• То нису једини контејнери!

65

Page 66: Библиотека стандардних шаблона (Standard template library STL) · 2021. 1. 12. · Уобичајени задаци које обављамо у програмирању

Корисна стандардна заглавља

• <iostream> I/O streams, cout, cin, …

• <fstream> file streams

• <algorithm> sort, copy, …

• <numeric> accumulate, inner_product, …

• <functional> function objects

• <string>

• <vector>

• <map>

• <unordered_map> hash table

• <list>

• <set>

66