OO 演習課 20 10/06/10
-
Upload
kylemore-losty -
Category
Documents
-
view
48 -
download
1
description
Transcript of OO 演習課 20 10/06/10
![Page 1: OO 演習課 20 10/06/10](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/1.jpg)
Templates & STL Instructor: 小黑
![Page 2: OO 演習課 20 10/06/10](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/2.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/3.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/4.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/5.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/6.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/7.jpg)
![Page 8: OO 演習課 20 10/06/10](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/8.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/9.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/10.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/11.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/12.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/13.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/14.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/15.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/16.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/17.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/18.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050819/56813253550346895d98d6c9/html5/thumbnails/19.jpg)