Upload
kylemore-losty
View
35
Download
1
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
Templates & STL Instructor: 小黑
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; …
TemplatesTemplates
Two types of templates: Function Template Class Template
Define Templates:template<class T> template<class T=float>
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
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;
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!”;
}
} ;
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/
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
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
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
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/
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(…)
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 );
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
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/
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.
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/