19
Templates & STL Instructor: 小小

OO 演習課 20 10/06/10

Embed Size (px)

DESCRIPTION

OO 演習課 20 10/06/10. Templates & STL Instructor: 小黑. Templates. Template serves as a class outline, from which specific classes are generated at compile time . One template can be used to generate many classes. - PowerPoint PPT Presentation

Citation preview

Page 1: OO 演習課 20 10/06/10

Templates & STL Instructor: 小黑

Page 2: OO 演習課 20 10/06/10

TemplatesTemplates

Template serves as a class outline, from which specific classes are generated at compile time.

One template can be used to generate many classes.

temp_class<int> a; temp_class<char> b; …

Page 3: OO 演習課 20 10/06/10

TemplatesTemplates

Two types of templates: Function Template Class Template

Define Templates:template<class T> template<class T=float>

Page 4: OO 演習課 20 10/06/10

Template’s ExampleTemplate’s Example

void main() {X<int, float> x1;//T1=int, T2=floatX<char, double*> x2;//T1=char, T2= double*int i=3;fun( i);//T3=int

}

template<class T1, class T2>

class X ;

//Class Template

template<typename T3>

void fun(T3 data) {}

//Function Template

//class and typename are the same

Page 5: OO 演習課 20 10/06/10

Partial SpecializationPartial Specialization

template<class T1, class T2>

class X {

public:

X() { cout << “Construct”; }

void display(T x) {

cout << “Origin!”;

}

} ;

template<class T1>

class X <T, int> {

public:

X() { cout << “Construct”; }

void display(int x) {

cout << “Specialize!!”;

}

} ; X<float,float> t1;X<float,int> t2;

Page 6: OO 演習課 20 10/06/10

Function SpecializationFunction Specialization

void X<int>::display(int x) {cout << “Integer!!”;

}void X<char>::display(int

x) {cout << “Character!!”;

}

template<class T>

class X {

public:

X() { cout << “Construct”; }

void display(T x) {

cout << “Origin!”;

}

} ;

Page 7: OO 演習課 20 10/06/10
Page 8: OO 演習課 20 10/06/10

STLSTL Container classes

Sequences vector , list

Associative Containers map , set

Container adapters Stack , queue , priority_queue

String• String , rope

bitset

Operation/Utilities iterator algorithm

http://www.cplusplus.com/

Page 9: OO 演習課 20 10/06/10

VectorVector

#include <iostream>

#include <vector>

using namespace std;

int main () {

vector<int> v; // Template!

for (int i=1; i<=10 ; i++)

v.push_back(i);

v.erase (v.begin()+5);

v.erase (v.begin(),v.begin()+3);

v.pop_back();

for (int i=0; i<v.size(); i++)

cout << v[i] << " ";

return 0;

}

Dynamic array of variables, struct or objects.

Insert data at the end.

http://www.cplusplus.com/reference/stl/vector/

4 5 7 8 9

Page 10: OO 演習課 20 10/06/10

Using iterator Using iterator

#include <iostream>

#include <vector>

using namespace std;

int main () {

vector<int> v1 (3,100);

vector<int>::iterator it;

it = v1.begin();

it = v1.insert (it,200);

v1.insert (it,2,300);

// "it" no longer valid

it = v1.begin();

vector<int> v2 (2,150); v1.insert( it+3, v2.begin(), v2.end()); int a1 [] = { 501,502,503 }; v1.insert (v1.begin(), a1, a1+3);

for (it=v1.begin();it<v1.end(); it++) cout << *it << " "; cout << endl;

return 0; }

501 502 503 300 300 200 150 150 100 100 100

Page 11: OO 演習課 20 10/06/10

Two and three dimensional Two and three dimensional vectorvector#include <iostream>

#include <vector>

using namespace std;

int main () {

vector< vector<int> > d2( 2,vector<int>(3,0));

d2[0][0]=1, d2[0][1]=2, d2[0][2]=3; d2[1][0]=4, d2[1][1]=5, d2[1][2]=6;

for (int i=0;i<(int)d2.size();i++){

for (int j=0;

j<(int)d2[i].size();j++)

cout << d2[i][j] << " ";

cout << endl;

}

vector< vector< vector<int> > > d3; d3.push_back(d2); cout << "Using iterator :" << endl;

vector<vector< vector<int> > >::iterator it1; vector<vector<int> >::iterator it2; vector<int>::iterator it3; for (it1=d3.begin();it1!=d3.end();it1++) for (it2=(*it1).begin();

it2!=(*it1).end();it2++) for (it3=(*it2).begin();

it3!=(*it2).end();it3++) cout << *it3 << " ";

return 0; }

1 2 3 4 5 6Using iterator :1 2 3 4 5 6

Page 12: OO 演習課 20 10/06/10

MapMap

Maps are a kind of associative containers that stores elements formed by the combination of a key value and a mapped value.

#include <iostream> #include <map> #include <string> using namespace std; int main () { map<char,string> mymap;

mymap['a']="an element"; mymap['b']="another element"; mymap['c']=mymap['b'];

cout << “'a' is " << mymap['a'] << endl; cout << “'b' is " << mymap['b'] << endl; cout << “'c' is " << mymap['c'] << endl; cout << “'d' is " << mymap['d'] << endl; cout << "mymap now contains " << (int)mymap.size() << " elements." << endl; return 0; }

'a' is an element 'b' is another element 'c' is another element 'd' is mymap now contains 4 elements.http://www.cplusplus.com/reference/stl/map/

Page 13: OO 演習課 20 10/06/10

AlgorithmAlgorithm

The header <algorithm> defines a collection of functions especially designed to be used on ranges of elements.

We can accesses through iterators or pointers, such as an array or an instance of some of the STL containers.

for_each( iterator , iterator , *func)

find( iterator , iterator , T) find_if( iterator , iterator ,

*func) count( iterator , iterator , T) find(…) , find_if(…) replace (…), replace_if(…) sort(…) binary_search(…) search(…)

Page 14: OO 演習課 20 10/06/10

Sort exampleSort example#include <iostream> #include <algorithm> #include <vector>using namespace std;

bool myfunction (int i,int j) { return (i<j); }

struct myclass { bool operator() (int i,int j) { return (i>j); } } myobject;

int main () {

int myints[]={32,71,12,45,26,80,53,33}; vector<int> v(myints, myints+8); vector<int>::iterator it;

//using default comparison (operator <): sort (v.begin(), v.begin()+4); //(12 32 45 71)26 80 53 33 // using function as comp sort (v.begin()+4, v.end(), myfunction); // 12 32 45 71(26 33 53 80) // using object as comp sort (v.begin(), v.end(), myobject); //(80 71 53 45 33 32 26 12)

cout << "sort:"; for (it=v.begin(); it!=v.end(); it++) cout << " " << *it; cout << endl; return 0; }

sort: 80 71 53 45 33 32 26 12

template <class Iter> void sort ( Iter first, Iter last );

Page 15: OO 演習課 20 10/06/10

Search exampleSearch example#include <iostream> #include <algorithm> #include <vector>using namespace std;

bool myfunction (int i,int j) { return (i==j); }

int main () { vector<int> v; vector<int>::iterator it;

for ( int i=0 ; i<10 ; i++ ) v.push_pack(i*10);

// using default comparison: int match1[] = {40,50,60,70}; it = search (v1.begin(), v1.end(), match1, match1+4); if (it!=v.end()) cout << “match1 found at position " << int(it-v.begin()) << endl; else cout << "match not found" << endl;

// using predicate comparison: int match2[] = {20,30,50}; it = search (v.begin(), v.end(), match2, match2+3, myfunction); if (it!=v.end()) cout << "match2 found at position " << int(it-v.begin()) << endl; else cout << "match2 not found" << endl; return 0; }

match1 found at position 3 match2 not found

Page 16: OO 演習課 20 10/06/10

Today’s practice Today’s practice

Write a function called plus that uses function template. The function have two parameters and return the result of adding.

Use algorithm ” for_each” to output all data in the output vector. You can check the usage from the web page:

http://www.cplusplus.com/

Page 17: OO 演習課 20 10/06/10

Today’s practiceToday’s practice// YOUR CODE HERE

int main() {

int i = plus( 6, 2);

double d = plus(1.67,8.2);

cout << i << endl << d << endl;

string s1= plus<string>("he", "llo");

string s2= plus<string>( s1 , " again");

string s3= plus<string>( "b", "ye!");

vector<string> output;

output.push_back(s1);

output.push_back(s2);

output.push_back(s3);

// YOUR CODE HERE

// for_each(…)

return 0;

}

You need to fill these vacancies.

Page 18: OO 演習課 20 10/06/10

ReferenceReference

http://www.csie.nctu.edu.tw/~jlhuang/course/OOP/notes/chapter10.pdf

http://www.iis.sinica.edu.tw/~kathy/vcstl/templates.htm http://blog.roodo.com/rocksaying/archives/3641717.html http://www.yolinux.com/TUTORIALS/LinuxTutorialC+

+STL.html http://www.cplusplus.com/

Page 19: OO 演習課 20 10/06/10