C++ STL基础



 1 #include <stdio.h>
 2 template<class T>
 3 class MyArray 
 4 {
 5 private:
 6     int m_nTotalSize;
 7     int m_nValidSize;
 8     T * m_pData;
 9 public:
10     MyArray(int nSize = 3)
11     {
12         m_pData = new T[nSize];
13         m_nTotalSize = nSize;
14         m_nValidSize = 0;
15     }
16 
17     void Add(T value)
18     {
19         if(m_nValidSize < m_nTotalSize)
20         {
21             m_pData[m_nValidSize] = value;
22             m_nValidSize ++;
23         }
24     
25         else
26         {
27             T * tmpData = new T[m_nTotalSize];
28             for(int i = 0 ; i < m_nTotalSize ;i ++)
29                 tmpData[i] = m_pData[i];
30             delete []  m_pData;
31             
32             m_nTotalSize *= 2;
33             m_pData = new T[m_nTotalSize];
34             for(int i = 0 ;i < m_nValidSize ;i ++)
35                 m_pData[i] = tmpData[i];
36             delete [] tmpData;
37             m_pData[m_nValidSize] = value;
38             m_nValidSize ++;
39         }
40     }
41 
42     int GetSize()
43     {
44         return m_nValidSize;
45     }
46 
47     T  Get(int pos)
48     {
49         return m_pData[pos];
50     }
51     
52     virtual ~MyArray() 
53     {
54         if(m_pData != NULL)
55         {
56             delete [] m_pData;
57             m_pData = NULL;
58         }
59     }
60 };
61 
62 
63 
64 int main(int argc,char *argv[])
65 {
66     MyArray<int> obj;
67     obj.Add(1);
68     obj.Add(2);
69     obj.Add(3);
70     obj.Add(4);
71     
72     for(int i = 0 ;i < obj.GetSize() ;i ++)
73         printf("%d\n",obj.Get(i));
74     
75     return 0 ;
76 }
复制代码

 

STL标准模板库非常强调 软件复用,traits技术是采用的重要手段。traits中文意思是特性。traits依靠显式模板特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class CIntArray
 5 {
 6     int a[10];
 7 public:
 8 
 9     CIntArray()
10     {
11         for(int i = 0 ;i < 10 ;i ++)
12             a[i] = i + 1 ;
13     }
14 
15     int GetSum(int times)
16     {
17         int sum = 0;
18         for(int i = 0; i < 10 ;i ++)
19             sum += a[i];
20         return sum*times;
21     }
22 };
23 
24 
25 class CFloatArray
26 {
27     float f[10];
28 public:
29     CFloatArray()
30     {
31         for(int i = 1 ;i < 10 ;i ++)
32             f[i-1] = 1.0f/i;
33     }
34 
35     float GetSum(float times)
36     {
37         float sum = 0.0f;
38         
39         for(int i = 0; i < 10 ;i ++)
40             sum += f[i];
41         
42         return sum * times;
43     }
44 };
45 
46 int main() 
47 {
48     CIntArray intary;
49     CFloatArray  fltary;
50     cout << "Int array sum 3 times is :" << intary.GetSum(3) << endl;
51     cout << "Float array sum 3.2 times is :" << fltary.GetSum(3.2f) << endl;
52 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class CIntArray
 5 {
 6     int a[10];
 7 public:
 8 
 9     CIntArray()
10     {
11         for(int i = 0 ;i < 10 ;i ++)
12             a[i] = i + 1 ;
13     }
14 
15     int GetSum(int times)
16     {
17         int sum = 0;
18         for(int i = 0; i < 10 ;i ++)
19             sum += a[i];
20         return sum*times;
21     }
22 };
23 
24 
25 class CFloatArray
26 {
27     float f[10];
28 public:
29     CFloatArray()
30     {
31         for(int i = 1 ;i < 10 ;i ++)
32             f[i-1] = 1.0f/i;
33     }
34 
35     float GetSum(float times)
36     {
37         float sum = 0.0f;
38         
39         for(int i = 0; i < 10 ;i ++)
40             sum += f[i];
41         
42         return sum * times;
43     }
44 };
45 
46 template<class T>
47 class CApply
48 {
49 public:
50     float GetSum(T &t,float inpara)
51     {
52         return t.GetSum(inpara);
53     }
54 };
55 
56 
57 int main() 
58 {
59     CIntArray intary;
60     CFloatArray fltary;
61     CApply<CIntArray> c1;
62     CApply<CFloatArray> c2;
63     cout << "Int array sum 3 times is :" << c1.GetSum(intary,3) << endl;
64     cout << "Float array sum 3.2 times is :" << c2.GetSum(fltary,3.2f) << endl;
65 }
复制代码
复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 class CIntArray
  5 {
  6     int a[10];
  7 public:
  8 
  9     CIntArray()
 10     {
 11         for(int i = 0 ;i < 10 ;i ++)
 12             a[i] = i + 1 ;
 13     }
 14 
 15     int GetSum(int times)
 16     {
 17         int sum = 0;
 18         for(int i = 0; i < 10 ;i ++)
 19             sum += a[i];
 20         return sum*times;
 21     }
 22 };
 23 
 24 
 25 class CFloatArray
 26 {
 27     float f[5];
 28 public:
 29     CFloatArray()
 30     {
 31         for(int i = 1 ;i <= 5 ;i ++)
 32             f[i-1] = 1.0f * i;
 33     }
 34 
 35     float GetSum(float times)
 36     {
 37         float sum = 0.0f;
 38         
 39         for(int i = 0; i < 5 ;i ++)
 40             sum += f[i];
 41         
 42         return sum * times;
 43     }
 44 };
 45 
 46 template<class T>
 47 class NumTraits
 48 {
 49 
 50 };
 51 
 52 template<> class NumTraits<CIntArray>
 53 {
 54 public:
 55     typedef int resulttype;
 56     typedef int inputpara;
 57 };
 58 
 59 template<> class NumTraits<CFloatArray>
 60 {
 61 public:
 62     typedef float  resulttype;
 63     typedef float  inputpara;
 64 };
 65 /*
 66 template<class T>
 67 class CApply
 68 {
 69 public:
 70 //    typedef NumTraits<T>::resulttype result;
 71 //    typedef NumTraits<T>::inputpara inputpara;
 72 
 73     NumTraits<T>::resulttype GetSum(T &obj,NumTraits<T>::inputpara  in)
 74     {
 75         return obj.GetSum(in);
 76     }
 77 };
 78 */
 79 
 80 template<class T>
 81 class CApply
 82 {
 83 public:
 84     typedef typename NumTraits<T>::resulttype result;
 85     typedef typename NumTraits<T>::inputpara inputpara;
 86     result GetSum(T &t,inputpara inpara)
 87     {
 88         return t.GetSum(inpara);
 89     }
 90 };
 91 
 92 int main() 
 93 {
 94     CIntArray intary;
 95     CFloatArray fltary;
 96     CApply<CIntArray> c1;
 97     CApply<CFloatArray> c2;
 98     cout << "Int array sum 3 times is :" << c1.GetSum(intary,3) << endl;
 99     cout << "Float array sum 3 times is :" << c2.GetSum(fltary,3.0f) << endl;
100 }
复制代码

迭代器

 

复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 template<class T>
  5 class MyArray
  6 {
  7 private:
  8     int m_nTotalSize;
  9     int m_nValidSize;
 10     T * m_pData;
 11 public:
 12     MyArray(int nSize = 3)
 13     {
 14         m_pData = new T[nSize];
 15         m_nTotalSize = nSize;
 16         m_nValidSize = 0;
 17     }
 18 
 19     void Add(T value)
 20     {
 21         if(m_nValidSize < m_nTotalSize)
 22         {
 23             m_pData[m_nValidSize] = value;
 24             m_nValidSize ++;
 25         }
 26     
 27         else
 28         {
 29             T * tmpData = new T[m_nTotalSize];
 30             for(int i = 0 ; i < m_nTotalSize ;i ++)
 31                 tmpData[i] = m_pData[i];
 32             delete []  m_pData;
 33             
 34             m_nTotalSize *= 2;
 35             m_pData = new T[m_nTotalSize];
 36             for(int i = 0 ;i < m_nValidSize ;i ++)
 37                 m_pData[i] = tmpData[i];
 38             delete [] tmpData;
 39             m_pData[m_nValidSize] = value;
 40             m_nValidSize ++;
 41         }
 42     }
 43 
 44     int GetSize()
 45     {
 46         return m_nValidSize;
 47     }
 48 
 49     T  Get(int pos)
 50     {
 51         return m_pData[pos];
 52     }
 53 
 54     T * Begin()
 55     {
 56         return m_pData;
 57     }
 58 
 59     T * End()
 60     {
 61         return m_pData + m_nValidSize;
 62     }
 63 
 64     
 65     virtual ~MyArray() 
 66     {
 67         if(m_pData != NULL)
 68         {
 69             delete [] m_pData;
 70             m_pData = NULL;
 71         }
 72     }
 73 };
 74 
 75 template<class  T>
 76 struct Unit
 77 {
 78     T value;
 79     Unit * next;
 80 };
 81 
 82 template<class T>
 83 class MyLink
 84 {
 85     Unit<T> * head;
 86     Unit<T> * tail;
 87     Unit<T> * prev;
 88 
 89 public:
 90     MyLink() 
 91     {
 92         head = tail = prev = NULL;
 93     }
 94 
 95     void Add(T &value)
 96     {
 97         Unit<T> * u = new Unit<T>();
 98         u -> value = value;
 99         u -> next = NULL;
100         if(head == NULL)
101         {
102             head =  u;
103             prev = u;
104         }
105         else
106         {
107             prev -> next = u;
108             prev = u;
109         }
110         tail = u -> next;
111     }
112 
113     Unit<T> * Begin()
114     {
115         return head;
116     }
117 
118     Unit<T> * End()
119     {
120         return tail;
121     }
122     
123     virtual ~ MyLink() 
124     {
125         if(head != NULL)
126         {
127             Unit<T> * prev = head;
128             Unit<T> * next = NULL;
129             while( prev != tail)
130             {
131                 next = prev -> next;
132                 delete prev;
133                 prev = next;
134             }
135         }
136     }
137 };
138 
139 
140 template<class Init>
141 class ArrayIterator
142 {
143     Init * init;
144 public:
145     ArrayIterator(Init * init)
146     {
147         this -> init = init;
148     }
149         
150     bool operator != (ArrayIterator & it)
151     {
152         return this->init <= it.init;
153     }
154 
155     void operator ++ (int)
156     {
157         init ++;
158     }
159 
160     Init operator*()
161     {
162         return *init;
163     }
164 };
165 
166 template<class Init>
167 class LinkIterator
168 {
169     Init * init;
170 public:
171     LinkIterator(Init *init)
172     {
173         this -> init = init;
174     }
175 
176     bool operator != (LinkIterator & it)
177     {
178         return this->init != it.init;
179     }
180 
181     void operator ++ (int)
182     {
183         init = init->next;
184     }
185     
186     Init operator * ()
187     {
188         return *init;
189     }
190 };
191 
192     
193 template<class T>
194 ostream & operator << (ostream &os ,Unit<T> &s)
195 {
196     os << s.value;
197     return os;
198 }
199 
200 
201 
202 template<class Init>
203 void display(Init start,Init end)
204 {
205     cout << endl;
206     for(Init mid = start ; mid != end ; mid ++)
207         cout << *mid << '\t';
208     cout << endl;
209 }
210 
211 /*
212 int main() 
213 {
214     MyArray<int> ary;
215     for(int i = 0; i < 5 ;i ++)
216     {
217         ary.Add(i + 1);
218     }
219     ArrayIterator<int> start(ary.Begin());
220     ArrayIterator<int> end(ary.End());
221     cout << "Array element is: ";
222     display(start,end);
223 
224     return 0;
225 }
226 */
227 int main()
228 {
229     int m = 0;
230     MyLink<int> ml;
231     for(int i = 0;i < 5 ;i ++)
232     {
233         m = i + 1;
234         ml.Add(m);
235     }
236     
237     LinkIterator<Unit<int> > start(ml.Begin());
238     LinkIterator<Unit<int> > end(ml.End());
239 
240     display(start,end);
241 
242     return 0;
243 }
复制代码

 

复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 
  5 template<class T>
  6 class MyLink
  7 {
  8 public:
  9     struct Unit
 10     {
 11         T value;
 12         Unit * next;
 13     };
 14 
 15 class LinkIterator
 16 {
 17     Unit *init;
 18 public:
 19     LinkIterator(Unit *init)
 20     {
 21         this -> init = init;
 22     }
 23 
 24     bool operator != (LinkIterator &it)
 25     {    
 26         return this->init != it.init;
 27     }
 28 
 29     void operator ++ (int)
 30     {
 31         init = init -> next;
 32     }
 33     
 34     Unit operator * ()
 35     {
 36         return *init;
 37     }
 38 };
 39 
 40     Unit * head;
 41     Unit * tail;
 42     Unit * prev;
 43 
 44 public:
 45     MyLink() 
 46     {
 47         head = tail = prev = NULL;
 48     }
 49 
 50     void Add(T &value)
 51     {
 52         Unit * u = new Unit();
 53         u -> value = value;
 54         u -> next = NULL;
 55         if(head == NULL)
 56         {
 57             head =  u;
 58             prev = u;
 59         }
 60         else
 61         {
 62             prev -> next = u;
 63             prev = u;
 64         }
 65         tail = u -> next;
 66     }
 67 
 68     Unit * Begin()
 69     {
 70         return head;    
 71     }
 72     
 73     Unit * End()
 74     {
 75         return tail;
 76     }
 77 
 78     virtual ~ MyLink() 
 79     {
 80         if(head != NULL)
 81         {
 82             Unit* prev = head;
 83             Unit* next = NULL;
 84             while( prev != tail)
 85             {
 86                 next = prev -> next;
 87                 delete prev;
 88                 prev = next;
 89             }
 90         }
 91     }
 92 };
 93 
 94 
 95 template<class T>
 96 ostream & operator << (ostream &os, typename MyLink<T>::Unit & s)
 97 {
 98     os << s.value;
 99     return os;
100 }
101 
102 template<class Init>
103 void display(Init start,Init end)
104 {
105     cout << endl;
106     for(Init mid = start ; mid != end ; mid ++)
107         cout << *mid << '\t' ;
108 
109     cout << endl;
110 }
111 
112 int main()
113 {
114     int m = 0;
115     MyLink<int> ml;
116 
117     for(int i = 0; i < 5 ;i ++)
118     {
119         m = i + 1;
120         ml.Add(m);
121     }
122 
123     MyLink<int>::LinkIterator start = ml.Begin();
124     MyLink<int>::LinkIterator end = ml.End;
125     display(start,end);
126 
127     return 0;
128 }
复制代码

 

STL迭代器:

复制代码
 1 #include <iostream>
 2 #include <iterator>
 3 using namespace std;
 4 
 5 int main(int argc,char * argv[])
 6 {
 7     cout << "Please input data: ";
 8     istream_iterator<int> a(cin);
 9 
10     istream_iterator<int> b;
11     
12     while(1)
13     {
14         cout << *a << endl;
15         a ++;
16         if( a == b)
17             break;
18     }
19 
20     return 0;
21 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <iterator>
 3 using namespace std;
 4 
 5 int main(int argc,char * argv[])
 6 {
 7     cout << "ostream_iterator result: ";
 8     ostream_iterator<int> myout(cout,"\t");
 9     
10     *myout = 1;
11     myout ++;
12     *myout = 2;
13     myout ++;
14     *myout = 3;
15 
16     return 0;
17 }
复制代码

 

 

输入输出流

 

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() 
 5 {
 6     int i;
 7     float f;
 8     char str[20];
 9     
10     cin >> i ;
11     cin >> f;
12     cin >> str;
13 
14     cout << "i = " << i << endl;
15     cout << "f = " << f << endl;
16     cout << "str = " << str << endl;
17 
18     return 0;
19 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int i ;
 7     char str[20];
 8 
 9     cout << "Please input a integer and a string: ";
10     cin >> i >> str;
11     
12     cout << "i = " << i << endl;
13     cout << "str = " << str << endl;
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char szBuf[60];
 7     cout << "Please input a string: ";
 8     int n = cin.get();
 9     cin.getline(szBuf,60);
10     cout << n << endl;
11     cout << "The received string is :" << szBuf << endl;
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() 
 5 {
 6     int a; 
 7     cout << "Please input a data: ";
 8     cin >> a ;
 9     cout << "state is : " << cin.rdstate() << endl;
10 
11     if(cin.good())
12         cout << "the type inputed is right,no error!" << endl;
13     if(cin.fail()) 
14         cout << "the type inputed is wrong,is error!" << endl;
15     if(cin.bad())
16         cout << "deadly wrong!!!" << endl;
17     else
18         cout << "can go on!" << endl;
19 
20     return 0;
21 }  
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a;
 7     
 8     while(1)
 9     {
10         cin >> a;
11         if(cin.fail())
12         {    
13             cout << "Input error ! again ..." << endl;
14             cin.clear();
15             cin.get();
16         }
17         else
18         {
19             cout << a << endl;
20             break;
21         }
22     }
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main() 
 6 {
 7     char szBuf[80];
 8     ifstream in("iostream.cpp");
 9     if(!in)
10         return 0;
11     while(in.getline(szBuf,80))
12     {
13         cout << szBuf << endl;
14     }
15 
16     in.close();
17     
18     return 0;
19 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 struct STUDENT
 7 {    
 8     char strName[20];
 9     int nGrade;
10 };
11 
12 int  main()
13 {
14     ofstream out;
15     out.open("a.txt");
16     STUDENT st1={"zhangsan",90};
17     STUDENT st2={"lisi",80};
18     
19     out << st1.strName << "\t" << st1.nGrade << endl;
20     out << st2.strName << "\t" << st1.nGrade << endl;
21 
22     out.close();
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 struct STUDENT
 7 {    
 8     char strName[20];
 9     int nGrade;
10 };
11 
12 int  main()
13 {
14     ofstream out;
15     out.open("b.txt");
16     STUDENT st1={"zhangsan",90};
17     STUDENT st2={"lisi",80};
18     
19     out.write((const char *)&st1,sizeof(STUDENT));
20     out.write((const char *)&st2,sizeof(STUDENT));
21 
22     out.close();
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct STUDENT
 6 {
 7     char strName[20];
 8     int nGrade;
 9 };
10 
11 int main() 
12 {
13     ifstream in;
14     in.open("b.txt");
15     if(!in)
16         return 0;
17     
18     STUDENT st1;
19     STUDENT st2;
20 
21     in.read((char*)&st1,sizeof(STUDENT));
22     in.read((char*)&st2,sizeof(STUDENT));
23 
24     cout << st1.strName << "\t" << st1.nGrade << endl;
25     cout << st2.strName << "\t" << st2.nGrade << endl;
26 
27     in.close();
28     
29     return 0 ;
30 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     ifstream fin("b.txt");
 8     if(fin != NULL)
 9     {
10         cout << fin.rdbuf();
11     }
12 
13     fin.close();
14 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     fstream in_out;
 8     in_out.open("sb.txt",ios::in | ios::out | ios::trunc);
 9     in_out.write("Hello",5);
10 
11     in_out.seekg(0,ios::beg);
12     cout << in_out.rdbuf();
13     in_out.close();
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     float f;
10     string strHello;
11 
12     string strText = "1 3.14 hello";
13     istringstream s(strText);
14     s >> n;
15     s >> f;
16     s >> strHello;
17 
18     cout << "n= " << n << endl;
19     cout << "f= " << f << endl;
20     cout << "strHello= " << strHello << endl;
21 
22     return 0;
23 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     cout << "type an int,a float and a string: ";
 8     int i;
 9     float f;
10     string stuff;
11     cin >> i >> f;
12     getline(cin,stuff);
13     ostringstream os;
14     os << "integer=" << i << endl;    
15     os << "float = " << f << endl;
16     os << "string = " << stuff << endl;
17 
18     string result = os.str();
19     cout << result << endl;
20 
21     return 0;
22 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 class Student
 6 {
 7 public:
 8     string strName;
 9     string strSex;
10     int nAge;
11 };
12 
13 istream &  operator >> (istream &is,Student &s)
14 {
15     is >> s.strName >> s.strSex >> s.nAge;
16     return is;
17 }
18 
19 ostream & operator << (ostream &os,Student &s)
20 {
21     os << s.strName << "\t" << s.strSex << "\t" << s.nAge << endl;
22     return os;
23 }
24 
25 ostream & operator << (ostream &os,const Student &s)
26 {
27     cout << "const Student output is: " << endl;
28     os << s.strName << "\t" << s.strSex << "\t" << s.nAge << endl;
29     return os;
30 }
31 
32 void f(const Student &s)
33 {
34     
35     cout << s;
36 }
37 
38 int main(int argc, char *argv[])
39 {
40     Student s;
41     cout << "Please input data(name,sex,age): ";
42     cin >> s;
43     cout << "Input data is: ";
44     cout << s;
45 
46     return 0;
47 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <string>
 5 
 6 
 7 using namespace std;
 8 
 9 
10 int main(int argc,char *argv[])
11 {    
12     ifstream in("sb.txt");
13     
14     string strText;
15     string strName;
16     int nYuwen;
17     int nMath;
18     int nForeign;
19     int nTotal;
20     
21     while(!in.eof())
22     {
23         getline(in,strText);
24         istringstream inf(strText);
25     
26         inf >> strName >> nYuwen >> nMath >> nForeign;
27 
28         nTotal = nYuwen + nMath + nForeign;
29     
30         cout << strName <<"\t\t\t" << nYuwen << "\t\t\t" << nMath << "\t\t\t" << nForeign << "\t\t\t" << nTotal << endl;
31     }
32 
33     in.close();
34 
35     return 0;
36 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 class Student
 9 {
10 public:
11     string strName;
12     int nYuwen;
13     int nMath;
14     int nForeign;
15 };
16 
17 
18 istream &operator >> (istream & is,Student &s)
19 {
20     is >> s.strName >> s.nYuwen >> s.nMath >> s.nForeign;
21     return is;
22 }
23 
24 ostream &operator << (ostream &os, Student &s)
25 {
26     int nTotal = s.nYuwen + s.nMath + s.nForeign;
27     os << s.strName << "\t" << s.nYuwen << "\t" << s.nMath <<  "\t" << s.nForeign << "\t" << nTotal << endl;
28     return os;
29 }
30 
31 int main()
32 {
33     ifstream in("sb.txt");
34     Student s;
35     
36     while(!in.eof())
37     {
38         in >> s;
39         cout << s;
40     }
41 
42     in.close();
43     
44     return 0;
45 }
复制代码

 

 

字符串

字符串类减少了C语言编程中三种常见且最具破坏性的错误:

1,超越数组边界

2,通过未被初始化或被赋以错误值的指针来访问数组元素

3,在释放了某一数组原先所分配的存储单元后仍保留了“悬挂”指针

复制代码
 1 #include <string>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     string s1;
 7     string s2("How are you?");
 8     string s3(s2);
 9     string s4(s2,0,3);
10     string s5("Fine");
11     string s6=s2+"Fine";
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "How are you?";
 8     string s2(s1.begin(),s1.end());
 9     string s3(s1.begin()+4,s1.begin()+7);
10 
11     cout << s1 << endl << s2 << endl << s3 << endl;
12     return 0;
13 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = "do";
 8     cout << "Inition size is: " << s.size() << endl;
 9     s.insert(0,"How ");
10     s.append(" you");
11     s = s + " do?";
12 
13     cout << "final size is: " << s.size() << endl;
14 
15     cout << s;
16 
17     return 0 ;
18 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string s = "what's your name?";
 9     cout << "Before replace : " << s << endl;
10     s.replace(7,4,"her");
11     cout << "After repalce  : " << s << endl;
12 
13     return 0 ;
14 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = " what's your name? my name is TOM. How do you do ? Fine,thanks. ";
 8     int n = s.find("your");
 9     cout << "the first your pos: " << n << endl;
10     n = s.find("you",15);
11     cout << "the first your pos begin from 15:" << n << endl;
12     n = s.find_first_of("abcde");
13     cout << "find pos when character within abcde: " << n << endl;
14     n = s.find_last_of("abcde",3);
15     cout << "find last pos begin from 2 when character within abcde: " << n << endl;
16 
17     n = s.find_first_not_of("abcde");
18     cout << "find pos when character without abcde: " << n << endl;
19     n = s.find_last_not_of("abcde");
20     cout << "find last pos when character without abcde: " << n << endl;
21 
22     
23     return 0;
24 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "How are you?";
 8     s1.erase(s1.begin(),s1.begin()+3);
 9     cout << "after erase to s1 is : " << s1 << endl;
10     
11     string s2 = "Fine, thanks";
12     s2.erase(s2.begin(),s2.end());
13     cout << "after erase to s2 is: " << s2 << endl;
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "this";
 8     string s2 = "that";
 9     
10     if(s1 > s2)
11         cout << "s1>s2" << endl;
12     if(s1 == s2)
13         cout << "s1 = s2" << endl;
14     if(s1 < s2)
15         cout << "s1 < s2" << endl;
16 
17     return 0;
18 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 #include <sstream>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     int n1 = 10 ;
10     string s1;
11     stringstream os1;
12     os1 << n1;
13     os1 >> s1;
14 
15     cout << "make integer 10 to string 10: " << s1 << endl;
16 
17     int n2 = 0;
18     string s2 = "123";
19     stringstream os2;
20     os2 << s2;
21     os2 >> n2;
22     cout << "make string 123 to integer 123: " << n2 << endl;
23 
24     return 0 ;
25 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string strText = "How are you?";
 8     string strSeparator = " ";
 9     string strResult;
10     int size_pos = 0;
11     int size_prev_pos = 0 ; 
12     
13     while((size_pos = strText.find_first_of(strSeparator,size_pos)) != string::npos)
14     {
15         strResult = strText.substr(size_prev_pos,size_pos - size_prev_pos);
16         
17         cout << "string = " << strResult << endl;
18         size_prev_pos = ++ size_pos;
19     }
20 
21     if(size_prev_pos != strText.size())
22     {
23         strResult = strText.substr(size_prev_pos,size_pos - size_prev_pos);
24         cout << "string = " << strResult << endl;
25     }
26 
27     return 0;
28 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string strResult = " ";
 9     string strText = "How are you";
10     istringstream istr(strText);
11     
12     while(!istr.eof())
13     {
14         istr >> strResult;
15         cout << "string = " << strResult << endl;
16     }
17 
18     return 0 ;
19 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string strResult = " ";
 9     string strText = "How,are,you";
10     
11     istringstream istr(strText);
12     
13     while(! istr.eof())
14     {
15         getline(istr,strResult,',');
16         cout << "string = " << strResult << endl;
17     }
18 
19     return 0;
20 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = " hello  ";
 8     s.erase(0,s.find_first_not_of(" "));
 9     s.erase(s.find_last_not_of(" ")+1);
10     
11     cout << s ;
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <string>
 2 #include <sstream>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 class ext_string : public string
 7 {
 8 public:
 9     int GetInt(string strText)
10     {
11         int n = 0;
12         stringstream os;
13         os << strText;
14         os >> n;
15         return n;
16     }
17 
18     string GetString(int n)
19     {
20         string s;
21         stringstream os;
22         os << n;
23         os >> s;
24     
25         return s;
26     }
27 
28     string GetTrim(string strText)
29     {
30         strText.erase(0,strText.find_first_not_of(" "));
31         strText.erase(strText.find_last_not_of(" ") + 1);
32         return strText;
33     }
34 };
35 
36 int main()
37 {
38     ext_string extstring;
39     int n = extstring.GetInt("123");
40     string s1 = extstring.GetString(456);
41     string s2 = extstring.GetTrim("   hello               ");
42     
43     cout << "The string '123' convert to integer is: " << n << endl;
44     cout << "The integer 456 convert to string is : " << s1 << endl;
45     cout << "The string erase space is : " << s2 << endl;
46 
47     return 0 ;
48 }
复制代码

 

 

函数对象

函数对象是重载了 oprator()的类的一个实例,operator()是函数调用运算符。标准C++库根据operator()参数个数为0个,1个,2个加以划分,主要有下3中类型:

发生器:         一种没有参数且返回一个任意类型值的函数对象,例如随机数发生器

一元函数:     一种只有一个任意类型的参数,且返回一个可能不同类型值的函数对象

二元函数:     一种有两个任意类型的参数,且返回一个任意类型值的函数对象

一元判定函数: 返回bool型值的一元函数

二元判定函数: 返回bool型值的二元函数

 

可见,函数对象最多仅适用于两个参数

STL中一元函数基类是一个模板类:

template<class _A,class _R>

struct unary_function

{

             typedef  _A  argument_type;

             typedef  _B  result_type;

};

 

例子:

复制代码
 1 #include <algorithm>
 2 #include <iostream>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 
 8 class CSum
 9 {
10 private:
11     int sum;
12 public:
13     CSum() { sum = 0;}
14 
15     void operator()(int n)
16     {    
17         sum += n;
18     }
19 
20     int GetSum() { return sum;}
21 };
22 
23 
24 int main()
25 {
26     vector<int> v;
27     for(int i = 1;i <= 100 ;i ++)
28     {
29         v.push_back(i);
30     }
31 
32     CSum sObj = for_each(v.begin(),v.end(),CSum());
33     
34     cout << "sum = " << sObj.GetSum() << endl;
35 
36     return 0;
37 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 #include <vector>
 5 using namespace std;
 6 
 7 template<class _inPara,class _outPara> 
 8 class CSum : public unary_function<_inPara, _outPara>
 9 {
10 public:
11     _outPara sum;
12     CSum()  { sum =  0; }
13     void operator() (_inPara n)
14     {
15         sum += n;
16     }
17 
18     _outPara GetSum() { return sum; }
19 };
20 
21 int main()
22 {
23     vector<int> v;
24     
25     for(int i = 1; i <= 100; i ++)
26         v.push_back(i);
27 
28     CSum<int,int> sObj = for_each(v.begin(),v.end(),CSum<int,int>());
29     cout << "sum(int) = " << sObj.GetSum() << endl;
30 
31     vector<float> v2;
32     float f = 1.3f;
33     for(int i = 1 ;i<= 99 ;i ++)
34     {
35         v2.push_back(f);
36         f += 1.0f;
37     }
38 
39     CSum<float,float> sObj2 = for_each(v2.begin(),v2.end(),CSum<float,float>() );
40     cout << "sum(float) = " << sObj2.GetSum() << endl;
41 
42     return 0;
43 }
复制代码

 

STL中二元函数基类是一个模板类:

template<class Arg1,class Arg2,class Result>

struct binary_function

{

             typedef  Arg1  first_argument_type;

             typedef  Arg2  second_argument_type;

             typedef  Result  result_type;

};

X

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <string>
 6 #include <iterator>
 7 using namespace std;
 8 
 9 
10 class Student
11 {
12 public:
13     string name;
14     int grade;
15 public:
16     Student(string name,int grade)
17     {
18         this -> name = name;
19         this -> grade = grade;
20     }
21 
22     bool operator < (const Student & s) const
23     {
24         return grade < s.grade;
25     }
26 };
27 
28 
29 ostream & operator << (ostream &os,const Student &s)
30 {
31     os << s.name << '\t' << s.grade << endl;
32     return os;
33 }
34 
35 
36 template<class _inPara1,class _inPara2>
37 class binary_sort : public binary_function<_inPara1,_inPara2,bool>
38 {
39 public:
40     bool operator () (_inPara1 in1,_inPara2 in2)
41     {
42         return in1 < in2;
43     }
44 };
45 
46 
47 int main()
48 {
49     Student s1("zhangsan",60);
50     Student s2("lisi",80);
51     Student s3("wangwu",70);
52     Student s4("zhaoliu",90);
53     
54     vector<Student> v;
55     
56     v.push_back(s1);
57     v.push_back(s2);
58     v.push_back(s3);
59     v.push_back(s4);
60 
61     sort(v.begin(),v.end(),binary_sort<Student &,Student &>());
62     copy(v.begin(),v.end(),ostream_iterator<Student>(cout,""));
63 
64     return 0;
65 }
复制代码

 

STL内置函数对象:

复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 
 6 int main()
 7 {
 8     plus<int> plusObj;
 9     minus<int> minusObj;
10     multiplies<int> mulObj;
11     divides<int> divObj;
12     modulus<int> modObj;
13     negate<int> negObj;
14     
15     cout << plusObj(2,4) << endl;
16     cout << minusObj(2,4) << endl;
17     cout << mulObj(2,4) << endl;
18     cout << divObj(2,4) << endl;
19     cout << modObj(5,3) << endl;
20     cout << negObj(4) << endl;
21 
22     cout << plus<int>()(2,4) << endl;
23     cout << minus<int>()(2,4) << endl;
24     cout << multiplies<int>()(2,4) << endl;
25     cout << divides<int>()(2,4) << endl;
26     cout << modulus<int>()(5,3) << endl;
27     cout << negate<int>()(4) << endl;
28 
29     return 0;
30 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class Complex
 6 {
 7 public:
 8     float real;
 9     float virt;
10 public:
11     Complex()
12     {
13         this->real = 0.0f;
14         this->virt = 0.0f;
15     }
16 
17     Complex(float real,float virt)
18     {
19         this -> real = real;
20         this -> virt = virt;
21     }
22 
23     Complex operator + (const Complex &c) const
24     {
25         Complex v;
26         v.real = real + c.real;
27         v.virt = virt + c.virt;
28     
29         return v;
30     }
31 };
32 
33 
34 int main()
35 {
36     Complex c1(1.0f,2.0f);
37     Complex c2(3.0f,4.0f);
38     Complex c3 = c1 + c2;
39     
40     Complex c4 = plus<Complex>()(c1,c2);
41     
42     cout << c3.real << "+" << c3.virt << "i" << endl;
43     cout << c4.real << "+" << c4.virt << "i" << endl;
44 
45     return 0;
46 }
复制代码
复制代码
 1 #include <numeric>
 2 #include <iostream>
 3 #include <functional>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class Complex
 8 {
 9 public:
10     float real;
11     float virt;
12 public:
13     Complex()
14     {
15         this->real = 0.0f;
16         this->virt = 0.0f;
17     }
18 
19     Complex(float real,float virt)
20     {
21         this -> real = real;
22         this -> virt = virt;
23     }
24 
25     Complex operator + (const Complex &c) const
26     {
27         Complex v;
28         v.real = real + c.real;
29         v.virt = virt + c.virt;
30     
31         return v;
32     }
33 };
34 
35 
36 int main()
37 {
38     Complex c1(1.0f,2.0f);
39     Complex c2(3.0f,4.0f);
40     Complex c3 = c1 + c2;
41     
42     Complex c4 = plus<Complex>()(c1,c2);
43     
44     Complex c;
45     
46     vector<Complex> v;
47     v.push_back(c1);
48     v.push_back(c2);    
49      v.push_back(c3);
50     v.push_back(c4);
51     
52     Complex result = accumulate(v.begin(),v.end(),c,plus<Complex>());
53 
54     cout << result.real << "+" << result.virt << "i" << endl;
55 
56     return 0;
57 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     equal_to<int> equalObj;
 9     not_equal_to<int> notequalObj;
10     greater<int> greatObj;
11     greater_equal<int> greatequalObj;
12     less<int> lessObj;
13     less_equal<int> lessequalObj;
14 
15 
16     cout << equalObj(2,4) << endl;
17     cout << notequalObj(2,4) << endl;
18     cout << greatObj(2,4) << endl;
19     cout << greatequalObj(2,4) << endl;
20     cout << lessObj(2,4) << endl;
21     cout << lessequalObj(2,4) << endl;
22 
23     cout << equal_to<int>()(2,4) << endl;
24     cout << not_equal_to<int>()(2,4) << endl;
25     cout << greater<int>()(2,4) << endl;
26     cout << greater_equal<int>()(2,4) << endl;
27     cout << less<int>()(2,4) << endl;
28     cout << less_equal<int>()(2,4) << endl;
29 
30     return 0;
31 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     logical_and<int> andObj;
 8     logical_or<int> orObj;
 9     logical_not<int> notObj;
10     
11     cout << andObj(true,true) << endl;
12     cout << orObj(true,false) << endl;
13     cout << notObj(true) << endl;
14 
15     cout << logical_and<int>()(3<5,6<9);
16     cout << logical_or<int>()(3<5,6<9);
17     cout << logical_not<int>()(3<5);
18 
19     return 0;
20 }
复制代码

 

函数适配器:

1,可以形成复杂的,有语义的表达式

2,可以调用类中普通的成员函数

例子:

复制代码
 1 #include <iterator>
 2 #include <functional>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int a[] = {1,3,5,7,9,8,6,4,2,0};
10     
11     int nCount = count_if(a,a+sizeof(a)/sizeof(int),bind2nd(less<int>(),4));
12     cout << nCount << endl;
13 
14     nCount = count_if(a,a+sizeof(a)/sizeof(int),bind1st(less<int>(),4));
15     cout << nCount << endl;
16 
17     nCount = count_if(a,a+sizeof(a)/sizeof(int),not1(bind2nd(less<int>(),4)));
18     cout << nCount << endl;
19     
20     nCount = count_if(a,a+sizeof(a)/sizeof(int),not1(bind1st(less<int>(),4)));
21     cout << nCount << endl;
22 
23     sort(a,a+sizeof(a)/sizeof(int),not2(less<int>()));
24     copy(a,a+sizeof(a)/sizeof(int),ostream_iterator<int>(cout," "));
25 
26     return 0;
27 }
复制代码

X

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <string>
 6 
 7 using namespace std;
 8 
 9 class Student
10 {
11     string strNO;
12     string strName;
13 public:
14     Student(string strNO,string strName) : strNO(strNO),strName(strName){}
15     bool show()
16     {
17         cout << strNO << ":" << strName << endl;
18         return true;
19     }
20 };
21 
22 int main()
23 {
24     Student s1("1001","zhangsan");
25     Student s2("1002","lisi");
26     
27     vector<Student> v;
28     v.push_back(s1);
29     v.push_back(s2);
30     for_each(v.begin(),v.end(),mem_fun_ref(Student::show));
31     
32     Student *ps1 = new Student("1003","wangwu");
33     Student *ps2 = new Student("1004","zhaoliu");
34     vector<Student *> pv;
35     pv.push_back(ps1);
36     pv.push_back(ps2);
37     
38     for_each(pv.begin(),pv.end(),mem_fun(Student::show));
39 
40     return 0;
41 }
复制代码
复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 bool f(int x)
 7 {
 8     return x > 3;
 9 }
10 
11 bool g(int x,int y)
12 {
13     return x > y;
14 }
15 
16 
17 int main()
18 {
19     int a[] = {2,5,3,7,1,9,8,0,6};
20     
21     int nSize = sizeof(a) / sizeof(int);
22     int nCount = count_if(a,a+nSize,f);
23     cout << nCount << endl;
24 
25     nCount = count_if(a,a+nSize,ptr_fun(f));
26     cout << nCount << endl;
27     
28     nCount = count_if(a,a+nSize,bind2nd(ptr_fun(g),3));
29     cout << nCount << endl;
30 
31     nCount = count_if(a,a+nSize,bind2nd(ptr_fun(g),5));
32     cout << nCount << endl;
33 
34     return 0;
35 }
复制代码

 

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class Shape
 8 {
 9 public: virtual bool ShowArea() = 0;
10 };
11 
12 class Circle : public Shape
13 {
14     float r;
15 public:
16     Circle(float r) : r(r){}
17     bool ShowArea() {
18         cout << 3.14 * r * r << endl;
19         return true;
20     }
21 };
22 
23 class Rectangle : public Shape
24 {
25     float width,height;
26 public:
27     Rectangle(float width,float height) : width(width),height(height) {}
28     bool ShowArea() {
29         cout << width * height << endl;
30         return true;
31     }
32 };
33 
34 class AreaCollect
35 {
36     vector<Shape *> v;
37 public:
38     bool Add(Shape * pShape)
39     {
40         v.push_back(pShape);
41         return true;
42     }
43 
44     bool ShowEachArea()
45     {
46         for_each(v.begin(),v.end(),mem_fun(Shape::ShowArea));
47         return true;
48     }
49 };
50 
51 int main()
52 {
53     AreaCollect contain;
54     Shape * pObj1 = new Circle(10.0f);
55     Shape * pObj2 = new Rectangle(10.0f,20.0f);
56     
57     contain.Add(pObj1);
58     contain.Add(pObj2);
59     contain.ShowEachArea();
60 
61     return 0;
62 }
复制代码
复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <iterator>
 6 #include <string>
 7 
 8 using namespace std;
 9 
10 class Student
11 {
12 public:
13     string strNO;
14     int nGrade;
15 public:
16     Student(string strNO,int nGrade) : strNO(strNO),nGrade(nGrade) {}
17 };
18 
19 class StudIndex : public binary_function<int,int,bool>
20 {
21     vector<Student> &vStud;
22 public:
23     StudIndex(vector<Student>&vStud) : vStud(vStud) {}
24 
25     bool operator() (int a,int b)
26     {
27         return vStud.at(a).nGrade < vStud.at(b).nGrade;
28     }
29 };
30 
31 int main()
32 {
33     Student s1("1001",70);
34     Student s2("1002",60);
35     Student s3("1003",80);
36     Student s4("1004",74);
37 
38     vector<Student> v;
39     v.push_back(s1);
40     v.push_back(s2);
41     v.push_back(s3);
42     v.push_back(s4);
43 
44     vector<int> vIndex;
45     vIndex.push_back(0);
46     vIndex.push_back(1);
47     vIndex.push_back(2);
48     vIndex.push_back(3);
49 
50     sort(vIndex.begin(),vIndex.end(),StudIndex(v));
51     copy(vIndex.begin(),vIndex.end(),ostream_iterator<int>(cout," "));
52 
53     return 0;
54 }
复制代码

 

 

 

 

 

 

通用容器

 vector容器

 

复制代码
 1 #include <vector>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> int_vec;
 9 
10     int_vec.push_back(1);
11     int_vec.push_back(2);
12     int_vec.push_back(3);
13 
14     int nSize = int_vec.size();
15 
16     cout << "Array output style : ";
17     for(int i = 0; i < nSize ;i ++)
18     {
19         cout << int_vec[i] << "\t";
20     }
21     cout << endl;
22 
23     cout << "output via reference: ";
24     for(i = 0 ;i < nSize ;i++)
25     {
26         int &nValue = int_vec.at(i);
27         cout << nValue << "\t";
28     }
29     cout << endl;
30 
31     cout << "output via iterator: ";
32     vector<int>::iterator int_vec_iter = int_vec.begin();
33     while(int_vec_iter != int_vec.end())
34     {
35         cout << *int_vec_iter << "\t" ;
36         int_vec_iter ++;
37     }
38 
39     cout << endl;
40 
41     return 0;
42 }
复制代码

 

复制代码
 1 #include <vector>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class A
 6 {
 7 public:
 8     int n;
 9 public:
10     A(int n)
11     {
12         this -> n = n;
13     }
14 };
15 
16 int main()
17 {
18     cout << "Part one: class A vector operator" << endl;
19 
20     vector<A> ca_vec;
21     A a1(1);
22     A a2(2);
23     ca_vec.push_back(a1);
24     ca_vec.push_back(a2);
25     int nSize = ca_vec.size();
26 
27     cout << "\noutput via array:";
28     for(int i = 0 ; i < nSize; i++)
29     {
30         cout << ca_vec[i].n << "\t";
31     }
32     cout << "\noutput via reference: ";
33     for(i = 0 ;i < nSize ;i ++)
34     {
35         A & a = ca_vec.at(i);
36         cout << a.n << "\t";
37     }
38     cout << "\noutput via iterator: ";
39     vector<A>::iterator ca_vec_iter = ca_vec.begin();
40     while(ca_vec_iter != ca_vec.end())
41     {
42         cout << (*ca_vec_iter).n << "\t";
43         ca_vec_iter ++;
44     }
45 
46     cout << "\nPart two: class A pointer vector" << endl;
47 
48     vector<A *> pca_vec;
49 
50     A * pa1 = new A(1);
51     A * pa2 = new A(2);
52 
53     pca_vec.push_back(pa1);
54     pca_vec.push_back(pa2);
55 
56     nSize = pca_vec.size();
57 
58     cout <<"output via array: ";
59     for(i = 0 ; i < nSize ;i ++)
60     {
61         cout << pca_vec[i] -> n << "\t";
62     }
63     
64     cout << "\noutput via reference : ";
65     for(i = 0 ; i < nSize ;i ++)
66     {
67         A * & a = pca_vec.at(i);
68         cout << a->n << "\t";
69     }
70 
71     cout << "\noutput via iterator: ";
72     vector<A *>::iterator pca_vec_iter = pca_vec.begin();
73     while(pca_vec_iter != pca_vec.end())
74     {
75         cout << (**pca_vec_iter).n << "\t";
76         pca_vec_iter ++;
77     }
78 
79     delete pa1;
80     delete pa2;
81 
82     return 0;
83 }
复制代码
复制代码
 1 //modify.cpp
 2 #include <vector>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> int_vec;
 9     int_vec.push_back(1);
10     int_vec.push_back(2);
11     int_vec.push_back(3);
12 
13     cout << "Modify via array: Element two will be modified to  5:";
14     int_vec[1] = 5;
15 
16     for(int i = 0 ; i < int_vec.size() ;i ++)
17         cout << int_vec[i] << "\t";
18     cout << endl;
19 
20 
21     cout << "modify via reference: Element two will be modified to 10:";
22     int &m = int_vec.at(1);
23     m = 10;
24     for(i = 0 ;i < int_vec.size() ; i++)
25         cout << int_vec[i] << "\t";
26     cout << endl;
27 
28     cout << "modify via iterator: Element two will be modified to 20: ";
29     vector<int>::iterator int_vec_iter = int_vec.begin() + 1;
30     *int_vec_iter = 20;
31 
32     for(i = 0 ;i < int_vec.size() ;i++)
33         cout << int_vec[i] << "\t";
34     cout << endl;
35 
36     return 0;
37 }
复制代码
复制代码
 1 //erase.cpp
 2 #include <vector>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     vector<int> int_vec;
10     for(int i = 1 ;i <= 10  ;i++)
11         int_vec.push_back(i);
12 
13     int_vec.erase(int_vec.begin()+4);
14     cout << "erase the fivth element:";
15     for(i = 0 ;i < int_vec.size() ;i ++)
16         cout  << int_vec[i] << "\t";
17     cout  << endl;
18 
19     int_vec.erase(int_vec.begin()+1,int_vec.begin()+5);
20     cout << "erase Element 2 ~ 5: ";
21     for(i = 0 ;i < int_vec.size() ;i ++)
22         cout << int_vec[i] << "\t";
23     cout << endl;
24 
25     return 0;
26 }
复制代码
复制代码
 1 //final1.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 class Student
 9 {
10 public:
11     string m_strNO;
12     string m_strName;
13     string m_strSex;
14     string m_strDate;
15 public:
16     Student(string strNO,string strName,string strSex,string strDate) :
17       m_strNO(strNO),m_strName(strName),m_strSex(strSex),m_strDate(strDate) {}
18 
19       void Display() {
20           cout << m_strNO << "\t" << m_strName << "\t" << m_strSex << "\t" << m_strDate << endl;
21       }
22 };
23 
24 class StudCollect
25 {
26     vector<Student> m_vStud;
27 public:
28     void Add(Student &s) {
29         m_vStud.push_back(s);
30     }
31 
32     Student *Find(string strNO) {
33         bool bFind = false;
34 
35         for(int i = 0 ;i < m_vStud.size(); i ++)
36         {
37             Student &s = m_vStud.at(i);
38             if(s.m_strNO == strNO)
39             {
40                 bFind = true;
41                 break;
42             }
43         }
44 
45         Student *s = NULL;
46         if(bFind)
47             s = &m_vStud.at(i);
48 
49         return s;
50     }
51 };
52 
53 int main() {
54     Student s1("1001","zhangsan","boy","1985-10-10");
55     Student s2("1002","lisi","boy","1984-06-10");
56     Student s3("1003","wangwu","boy","1985-11-15");
57     StudCollect s;
58     s.Add(s1),s.Add(s2),s.Add(s3);
59 
60     Student *ps = s.Find("1002");
61 
62     if(ps)
63         ps->Display();
64 
65     return 0;
66 }
复制代码
复制代码
 1 //final2.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 using namespace std;
 6 
 7 class Book
 8 {
 9     string m_strBookNO;
10     string m_strBookName;
11     string m_strPublic;
12 public:
13     Book(string strNO,string strName,string strPublic):
14     m_strBookNO(strNO),m_strBookName(strName),m_strPublic(strPublic)
15     {
16         ;
17     }
18 };
19 
20 class Writer
21 {
22     string m_strWriteNO;
23     string m_strWriteName;
24     vector<Book>m_vecBook;
25 public:
26     Writer(string strNO,string strName):m_strWriteNO(strNO),m_strWriteName(strName) {}
27     void AddBook(Book &book) {
28         m_vecBook.push_back(book);
29     }
30 };
31 
32 class WriterCollect
33 {
34     vector<Writer> m_vecWriter;
35 public:
36     void AddWriter(Writer & writer) {
37         m_vecWriter.push_back(writer);
38     }
39 };
40 
41 int main() {
42     Writer w1("1001","zhangsan");
43     Book b1("b001","aaa","public");
44     Book b2("b002","bbb","public");
45     w1.AddBook(b1);
46     w1.AddBook(b2);
47 
48     Writer w2("1002","lisi");
49     Book b3("b003","ccc","public");
50     w2.AddBook(b3);
51 
52     WriterCollect collect;
53     collect.AddWriter(w1);
54     collect.AddWriter(w2);
55 
56     return 0;
57 }
复制代码

 

deque容器

 

复制代码
 1 //final2.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 using namespace std;
 6 
 7 class Book
 8 {
 9     string m_strBookNO;
10     string m_strBookName;
11     string m_strPublic;
12 public:
13     Book(string strNO,string strName,string strPublic):
14     m_strBookNO(strNO),m_strBookName(strName),m_strPublic(strPublic)
15     {
16         ;
17     }
18 };
19 
20 class Writer
21 {
22     string m_strWriteNO;
23     string m_strWriteName;
24     vector<Book>m_vecBook;
25 public:
26     Writer(string strNO,string strName):m_strWriteNO(strNO),m_strWriteName(strName) {}
27     void AddBook(Book &book) {
28         m_vecBook.push_back(book);
29     }
30 };
31 
32 class WriterCollect
33 {
34     vector<Writer> m_vecWriter;
35 public:
36     void AddWriter(Writer & writer) {
37         m_vecWriter.push_back(writer);
38     }
39 };
40 
41 int main() {
42     Writer w1("1001","zhangsan");
43     Book b1("b001","aaa","public");
44     Book b2("b002","bbb","public");
45     w1.AddBook(b1);
46     w1.AddBook(b2);
47 
48     Writer w2("1002","lisi");
49     Book b3("b003","ccc","public");
50     w2.AddBook(b3);
51 
52     WriterCollect collect;
53     collect.AddWriter(w1);
54     collect.AddWriter(w2);
55 
56     return 0;
57 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <deque>
 4 using namespace std;
 5 
 6 int main() 
 7 {
 8     vector<int> v(2);
 9     v[0] = 10;
10     int *p = &v[0];
11     cout << "In the Vector the first iterator element *p is: " << *p << endl;
12     v.push_back(20);
13     cout << "After varity the vector first iterator element *p is : " << *p << endl;
14 
15     deque<int> d(2);
16     d[0] = 10;
17     int *q = &d[0];
18     cout << "deque first iterator element *q is : " << *q << endl;
19     d.push_back(20);
20     cout << "After varity the deque first iterator element *q is : " << *q << endl;
21 
22     return 0;
23 }
复制代码
复制代码
 1 //final.cpp
 2 #include <iostream>
 3 #include <deque>
 4 using namespace std;
 5 
 6 template<class T>
 7 class MyQueue
 8 {
 9     deque<T> d;
10 public:
11     void push(const T&t)
12     {
13         d.push_back(t);
14     }
15     
16     void pop()
17     {
18         d.pop_front();
19     }
20 
21     int size()
22     {
23         return d.size();
24     }
25 
26     bool empty()
27     {
28         return d.empty();
29     }
30 
31     T &front()
32     {
33         return *d.begin();
34     }
35 
36     T &back()
37     {
38         return *(--d.end());
39     }
40 
41     void display()
42     {
43         for(int i = 0 ;i < d.size() ;i ++)
44             cout << d.at(i) << "\t";
45     }
46 };
47 
48 int main()
49 {
50     MyQueue<int> myqueue;
51     for(int i = 1 ; i <= 5 ;i ++)
52     {
53         myqueue.push(i);
54     }
55 
56     cout << "original queue: ";
57     myqueue.display();
58     cout << endl;
59     myqueue.pop();
60     cout << "After delete the front:";
61     myqueue.display();
62     cout << endl;
63     myqueue.push(6);
64     cout << "After insert element 6: ";
65     myqueue.display();
66     cout << endl;
67 
68     cout << "Current the front element: " << myqueue.front() << endl;
69     cout << "Current the tail elemet : " << myqueue.back() << endl;
70 
71     return 0;
72 }
复制代码

 

list容器

 

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 using namespace std;
 5 
 6 typedef  list<string> LISTSTR;
 7 
 8 int main()
 9 {
10     LISTSTR test;
11 
12     test.push_back("back");
13     test.push_front("middle");
14     test.push_front("front");
15 
16     cout << test.front() << endl;
17     cout << * test.begin() << endl;
18 
19     cout << test.back() << endl;
20     cout << *(test.rbegin()) << endl;
21 
22     test.pop_front();
23     test.pop_back();
24 
25     cout << test.front() << endl;
26 
27     return 0;
28 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4 
 5 typedef list<int> LISTINT;
 6 
 7 int main()
 8 {
 9     LISTINT test;
10 
11     for(int i = 0 ;i < 5 ;i ++)
12         test.push_back(i + 1);
13 
14     LISTINT::iterator it = test.begin();
15 
16     for(; it != test.end() ;it ++)
17         cout << *it << "\t";
18     cout << endl;
19 
20 
21     LISTINT::reverse_iterator rit = test.rbegin();
22 
23     for(; rit != test.rend() ; rit ++)
24     {
25         cout << *rit << "\t";
26     }
27     cout << endl;
28 
29     return 0;
30 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4 
 5 typedef list<int> LISTINT;
 6 
 7 int main()
 8 {
 9     LISTINT t1;
10 
11     t1.push_back(1);
12     t1.push_back(5);
13     t1.push_back(3);
14     t1.push_back(10);
15 
16     LISTINT t2;
17     t2.push_back(2);
18     t2.push_back(8);
19     t2.push_back(6);
20     t2.push_back(9);
21 
22     t1.sort();
23     t2.sort();
24 
25     t1.merge(t2);
26 
27     for(LISTINT::iterator it = t1.begin() ; it != t1.end() ;it ++)
28         cout << *it << "\t";
29 
30     cout << endl;
31 
32     cout << t1.size() << "\t" << t2.size() << endl;
33     
34     return 0 ;
35 }
复制代码
复制代码
  1 #include <iostream>
  2 #include <list>
  3 #include <string>
  4 using namespace std;
  5 
  6 class Student
  7 {
  8 private:
  9     string m_strNO;
 10     string m_strName;
 11     string m_strUniversity;
 12     int m_nTotal;
 13 public:
 14     Student(string strNO,string strName,string strUniversity,int nTotal) : m_strNO(strNO),
 15         m_strName(strName),m_strUniversity(strUniversity),m_nTotal(nTotal)
 16     {
 17         ;
 18     }
 19 
 20     bool operator < (Student &s)
 21     {
 22         return m_strNO < s.GetNO();
 23     }
 24 
 25     bool operator == (Student &s)
 26     {
 27         return m_strNO == s.GetNO();
 28     }
 29 
 30     string GetNO() { return m_strNO; }
 31     string GetName() { return m_strName; }
 32     string GetUniversity() { return m_strUniversity; }
 33 
 34     int GetTotal() { return m_nTotal; }
 35 };
 36 
 37 ostream & operator << (ostream &os,Student &s)
 38 {
 39     os << s.GetNO() << "\t" << s.GetName() << "\t" << s.GetUniversity() << "\t" << s.GetTotal();
 40     return os;
 41 }
 42 typedef list<Student> LISTSTUD;
 43 
 44 class StudManage
 45 {
 46 private:
 47     LISTSTUD m_stlList;
 48 public:
 49     bool Add(const Student &s)
 50     {
 51         m_stlList.push_back(s);
 52         return true;
 53     }
 54 
 55     bool Merge(StudManage & stud)
 56     {
 57         m_stlList.sort();
 58         stud.m_stlList.sort();
 59         m_stlList.merge(stud.m_stlList);
 60         m_stlList.unique();
 61 
 62         return true;
 63     }
 64 
 65     void Show()
 66     {
 67         for(LISTSTUD::iterator it = m_stlList.begin() ; it != m_stlList.end() ; it ++)
 68             cout << *it << endl;
 69     }
 70 };
 71 
 72 
 73 int main()
 74 {
 75     StudManage sm1;
 76     StudManage sm2;
 77 
 78     Student s1("1001","zhangsan","tsinghua",670);
 79     Student s2("1002","lisi","beida",660);
 80     Student s3("1003","wangwu","fudan",650);
 81     Student s4("1004","zhaoliu","nankai",640);
 82     Student s5("1005","zhouqi","tongji",630);
 83 
 84 
 85     sm1.Add(s1);
 86     sm1.Add(s2);
 87     sm1.Add(s5);
 88 
 89     sm2.Add(s5);
 90     sm2.Add(s4);
 91     sm2.Add(s3);
 92     sm2.Add(s1);
 93 
 94 
 95     sm1.Merge(sm2);
 96 
 97     sm1.Show();
 98 
 99     return 0;
100 }
复制代码
复制代码
  1 #include <iostream>
  2 #include <list>
  3 #include <string>
  4 
  5 using namespace std;
  6 
  7 class Term
  8 {
  9 private:
 10     int coef;
 11     int exp;
 12 public:
 13     Term(int coef,int exp) : coef(coef),exp(exp)
 14     {
 15         ;
 16     }
 17 
 18     int GetCoef() { return coef; }
 19     int GetExp() { return exp; }
 20     bool operator < (Term &t)
 21     {
 22         return exp < t.GetExp();
 23     }
 24 };
 25 
 26 typedef list<Term>LISTTERM;
 27 
 28 ostream & operator<<(ostream &os,Term &t)
 29 {
 30     os << t.GetCoef() << "x" << t.GetExp();
 31     return os;
 32 }
 33 
 34 class Polynomial
 35 {
 36 private:
 37     LISTTERM m_stlTermList;
 38 public:
 39     bool AddTerm(const Term & t)
 40     {
 41         m_stlTermList.push_back(t);
 42         return true;
 43     }
 44 
 45     Polynomial AddPolynomial(Polynomial & obj)
 46     {
 47         Polynomial  result;
 48 
 49         m_stlTermList.sort();
 50         obj.m_stlTermList.sort();
 51 
 52         LISTTERM::iterator src = m_stlTermList.begin();
 53         LISTTERM::iterator des = obj.m_stlTermList.begin();
 54 
 55         int coef = 0 ;
 56         int exp = 0;
 57 
 58         while((src != m_stlTermList.end()) && (des != obj.m_stlTermList.end()))
 59         {
 60             int nCurExp1 = (*src).GetExp();
 61             int nCurExp2 = (*des).GetExp();
 62 
 63             if(nCurExp1 == nCurExp2)
 64             {
 65                 coef = (*src).GetCoef() + (*des).GetCoef();
 66                 exp = (*src).GetExp();
 67                 src ++;
 68                 des ++;
 69             }
 70 
 71             if(nCurExp1 < nCurExp2)
 72             {
 73                 coef = (*src).GetCoef();
 74                 exp = (*src).GetExp();
 75 
 76                 src ++;
 77             }
 78 
 79             if(nCurExp1 > nCurExp2)
 80             {
 81                 coef = (*des).GetCoef();
 82                 exp = (*des).GetExp();
 83 
 84                 des ++;
 85             }
 86 
 87             if(coef != 0)
 88             {
 89                 Term t(coef,exp);
 90 
 91                 result.AddTerm(t);
 92             }
 93         }
 94 
 95         if(src != m_stlTermList.end())
 96         {
 97             LISTTERM temp(src,m_stlTermList.end());
 98             result.m_stlTermList.splice(result.m_stlTermList.end(),temp);
 99         }
100 
101         if(des != m_stlTermList.end())
102         {
103             LISTTERM temp(des,obj.m_stlTermList.end());
104             result.m_stlTermList.splice(result.m_stlTermList.end(),temp);
105         }
106 
107         return result;
108     }
109 
110     void Show()
111     {
112         LISTTERM::iterator it = m_stlTermList.begin();
113         while(it != m_stlTermList.end())
114         {
115             cout << *it << " + ";
116 
117             it ++;
118         }
119     }
120 };
121 
122 int main()
123 {
124     Polynomial p1;
125     Polynomial p2;
126 
127     Term t1(2,6);
128     Term t2(3,4);
129     Term t3(5,2);
130     Term t4(6,0);
131 
132     p1.AddTerm(t1);
133     p1.AddTerm(t2);
134     p1.AddTerm(t3);
135     p1.AddTerm(t4);
136 
137     Term t5(2,5);
138     Term t6(-3,4);
139     Term t7(5,2);
140     Term t8(8,0);
141 
142     p2.AddTerm(t5);
143     p2.AddTerm(t6);
144     p2.AddTerm(t7);
145     p2.AddTerm(t8);
146 
147     Polynomial p3 = p1.AddPolynomial(p2);
148 
149     p3.Show();
150 
151     return 0;
152 }
复制代码

 

 

queue && stack

 

 

复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <vector>
 5 #include <list>
 6 #include <stack>
 7 
 8 using namespace std;
 9 
10 void PrintStack(stack<int,vector<int> >obj)
11 {
12     while(!obj.empty())
13     {
14         cout << obj.top() << "\t";
15         obj.pop();
16     }
17 }
18 
19 void PrintStack(stack<string,list<string> >obj)
20 {
21     while(!obj.empty())
22     {
23         cout << obj.top() << "\t";
24         obj.pop();
25     }
26 }
27 
28 template<class T,class Container>
29 void PrintStack(stack<T,Container> obj)
30 {
31     while(!obj.empty())
32     {
33         cout << obj.top() << "\t";
34         obj.pop();
35     }
36 }
37 
38 int main()
39 {
40     stack<int,vector<int> > s;
41     for(int i = 0 ;i < 4 ;i ++)
42         s.push(i+1);
43 
44     PrintStack(s);
45     cout << endl;
46 
47     string str = "a";
48     stack<string,list<string> > t;
49     for(i = 0 ; i < 4 ;i ++)
50     {
51         t.push(str);
52         str += "a";
53     }
54     PrintStack(t);
55     cout << endl;
56 
57     stack<float,deque<float> > u;
58     for(i = 0 ;i < 4 ;i ++)
59         u.push(i+1);
60     PrintStack(u);
61 
62     return 0;
63 }
复制代码
复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <list>
 5 #include <deque>
 6 #include <queue>
 7 using namespace std;
 8 
 9 template<class T,class Container>
10 void PrintQueue(queue<T,Container> obj)
11 {
12     while(!obj.empty())
13     {
14         cout << obj.front() << "\t";
15         obj.pop();
16     }
17 }
18 
19 
20 int main()
21 {
22     string str = "a";
23     queue<string,deque<string> >t;
24 
25     for(int i =  0 ; i < 4; i ++)
26     {
27         t.push(str);
28         str += "a";
29     }
30     PrintQueue(t);
31     cout << endl;
32 
33     queue<float,list<float> > u;
34     for(i = 0 ;i < 4 ;i ++)
35     {
36         u.push(i + 1);
37     }
38 
39     PrintQueue(u);
40 
41     return 0;
42 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <deque>
 3 #include <stack>
 4 using namespace std;
 5 
 6 
 7 template<class T,class Container=deque<T> >
 8 class mystack : public stack<T,Container>
 9 {
10 private:
11     int m_nMaxSize ;
12 public:
13     mystack(int maxsize)
14     {
15         m_nMaxSize = maxsize;
16     }
17 
18     void push(const T &t)
19     {
20         if(this->size() < m_nMaxSize)
21         {
22             stack<T,Container>::push(t);
23         }
24         else
25         {
26             cout << "stack is fill." << "the term " << t << " is not pushed" << endl;
27         }
28     }
29 };
30 
31 
32 int main()
33 {
34     mystack<int,deque<int> >obj(2);
35 
36     obj.push(1);
37     obj.push(2);
38     obj.push(3);
39 
40     return 0 ;
41 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 class CExpress
 8 {
 9 private:
10     string m_strExpress;
11 public:
12     CExpress(string strExpress) : m_strExpress(strExpress)
13     {}
14     
15     bool IsValid()
16     {
17         bool flag = true;
18         char ch = 0 ;
19         char chstack = 0;
20         stack<char>sta_char;
21         int size = m_strExpress.length();
22 
23         for(int i = 0 ;i < size ;i ++)
24         {
25             ch = m_strExpress.at(i);
26             if(ch == '(' || ch == '[')
27                 sta_char.push(ch);
28             if(ch == ')' || ch == ']')
29                 if(sta_char.empty())
30                 {
31                     flag = false;
32                     break;
33                 }
34                 else
35                 {
36                     chstack = sta_char.top();
37                     if(chstack == '(' && ch == ')' )
38                         sta_char.pop();
39                     else if(chstack == '[' && ch == ']')
40                         sta_char.pop();
41                     else
42                     {
43                         flag = false;
44                         break;
45                     }
46                  }
47         }
48 
49         if(flag == true && !sta_char.empty())
50             flag = false;
51     
52         return flag;
53     }
54 };
55 
56 int main()
57 {
58     CExpress c1(")[]");
59     CExpress c2("([]");
60     CExpress c3("()[");
61     CExpress c4(")([]");
62     CExpress c5("([]())");
63 
64     c1.IsValid() == true ? cout << "c1 is right" << endl : cout << "c1 is wrong" << endl;
65     c2.IsValid() == true ? cout << "c2 is right" << endl : cout << "c2 is wrong" << endl;
66     c3.IsValid() == true ? cout << "c3 is right" << endl : cout << "c3 is wrong" << endl;
67     c4.IsValid() == true ? cout << "c4 is right" << endl : cout << "c4 is wrong" << endl;
68     c5.IsValid() == true ? cout << "c5 is right" << endl : cout << "c5 is wrong" << endl;
69 
70     return 0;
71 }
复制代码

 

 

priority_queue

 

 

复制代码
 1 #include <iterator>
 2 #include <iostream>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     int a[] = {1,2,3,4,5,6,7,8,9,10};
11     priority_queue<int> pr(a,a+9);
12     pr.push(a[9]);
13 
14     cout << "enter queue :";
15     copy(a,a+10,ostream_iterator<int>(cout,"\t"));
16     cout << endl;
17 
18     cout << "leave queue :";
19     while(!pr.empty())
20     {
21         cout << pr.top() << "\t";
22         pr.pop();
23     }
24 }
复制代码

 

复制代码
 1 #include  <iostream>
 2 #include  <queue>
 3 #include  <string>
 4 
 5 using namespace std;
 6 
 7 class Student
 8 {
 9     int NO;
10     string name;
11     int chinese;
12     int math;
13 public:
14     Student(int NO,string name,int chinese,int math)
15     {
16         this->NO=NO,this->name=name,this->chinese=chinese,this->math=math;
17     }
18 
19     int GetNO() { return NO;}
20     string GetName() { return name;}
21     int GetChinese() const { return chinese; }
22     int GetMath() const { return math; }
23 
24     bool operator < (const Student &s) const
25     {
26         int sum1 = chinese + math;
27         int chinese2 = s.GetChinese();
28         int math2 = s.GetMath();
29         int sum2 = chinese2 + math2;
30     
31         if(sum1 < sum2) 
32             return true;
33         if((sum1 == sum2) && (chinese < chinese2))
34             return true;
35         return false;
36     }
37 };
38 
39 
40 int main()
41 {
42     Student s[] = { Student(1001,"zhang",70,80),
43             Student(1002,"li",80,70),
44             Student(1003,"wang",90,85),
45             Student(1004,"zhao",85,75) };
46 
47 
48     priority_queue<Student>pr(s,s+4);
49     cout << "Grade sort from high to low:" << endl;
50     cout << "ID\tname\tChinese\tMath" << endl;
51     while(!pr.empty())
52     {
53         Student  t = pr.top();
54         cout << t.GetNO() << "\t" << t.GetName() << "\t" << t.GetChinese() << "\t" << t.GetMath() << endl;
55         pr.pop();
56     }
57 
58     return 0;
59 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 template<class T,class Cont=vector<T>,class Pred=less<typename Cont::value_type> >
 6 class FixedPriority : public priority_queue<T,Cont,Pred>
 7 {
 8     int nLimit;
 9 public:
10     FixedPriority(int nLimit)
11     {
12         this -> nLimit = nLimit;
13     }
14 
15     void SetLimitSize(int nLimit)
16     {
17         this -> nLimit = nLimit;
18     }
19 
20     bool Push(T &t)
21     {
22         if(nLimit > this->size())
23         {
24             push(t);
25             return true;
26         }
27         return false;
28     }
29 };
30 
31 int main()
32 {
33     FixedPriority<int> fp(10);
34     for(int i = 0 ;i < 15 ;i ++)
35     {
36         if(!fp.Push(i))
37             cout << "Priority_queue has been full. the " << i << "th element can't insert into" << endl;
38     }
39 
40     return 0;
41 }
复制代码

 

bitset

 

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     bitset<5> s1;
10     cout << "initialize memory : " << s1.to_string() << endl;
11     cout << "bit container size: " << s1.size() << "\tset 1 counts:" << s1.count() << endl;
12 
13     s1.set(2,true);
14     cout << "After the bit2 set 1 : ";
15     cout << "The memory is :" << s1.to_string() << endl;
16 
17     s1[3] = 1;
18     cout << "After the bit3 set 1 : ";
19     cout << "The memory is : " << s1.to_string() << endl;
20 
21     s1.set();
22     cout << "After all the bits set 1 : ";
23     cout << "The memory is : " << s1.to_string() << endl;
24     
25     bitset<16> s2(65535);
26     cout << "create bitset via long: " << s2.to_string() << endl;
27     
28     bitset<5> s3("1111101",2,5);
29     cout << "create bitset via string : " << s3.to_string() << endl;
30 
31     return 0;
32 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     bitset<5> s1("01011");
11     bitset<5> s2("10010");
12     
13     cout << "s1:" << s1.to_string() << "\t";
14     cout << "s2:" << s2.to_string() << endl;
15 
16     s1 &= s2;
17     
18     cout << "s1 &= s2: " << s1.to_string() << endl;
19     
20     
21     bitset<5> s3("01011");
22     bitset<5> s4("10010");
23     bitset<5> s5 = s3 & s4;
24 
25     cout << "s3:" << s3.to_string() << "\t";
26     cout << "s4:" << s4.to_string() << endl;
27 
28     cout << "s5 = s3 & s4: " << s5.to_string() << endl;
29     cout << "org s3: " << s3.to_string() << endl;
30 
31     return 0;
32 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     bitset<8> b("11011101");
10     cout <<  "org container b: " << b.to_string() << endl;
11 
12     for(int i = 0; i < 4 ;i ++)
13         b.flip(i);
14     cout << "After flip low 4bits : " << b.to_string() << endl;
15 
16     return 0;
17 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 template<size_t N>
 9 class MyAttend
10 {
11     int month;
12     bitset<N> b;
13 public:
14     MyAttend(int month,string strAttend) : month(month),b(strAttend)
15     {
16         ;
17     }
18 
19     int GetMonth() { return month; }
20     int GetAttendDays() { return b.count(); }
21 };
22 
23 class Student
24 {
25     string name;
26     vector<MyAttend<31> >v;
27 public:
28     Student(string name)
29     {
30         this -> name = name;
31     }
32 
33     void Add(MyAttend<31> &m)
34     {
35         v.push_back(m);
36     }
37 
38     void ShowAttendDays()
39     {
40         cout << "name: " << name << endl;
41         cout << "month\texits" << endl;
42         
43         for(int i = 0 ;i < v.size();i ++)
44         {
45             MyAttend<31> &m = v.at(i);
46             int month = m.GetMonth();
47             int days = m.GetAttendDays();
48             cout << month << "\t" << days << endl;
49         }
50     }
51 };
52 
53 int main()
54 {
55     Student stud1("zhang");
56 
57     string s1 = "1111100111110011111001111100111";
58     string s2 = "1111100111110011111001111100";
59 
60     MyAttend<31> m1(1,s1);
61     MyAttend<31> m2(2,s2);
62 
63     stud1.Add(m1);
64     stud1.Add(m2);
65 
66     stud1.ShowAttendDays();
67 
68     return 0;
69 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 template<size_t N>
 8 class MyNum
 9 {
10 public:
11     bitset<N> b;
12 public:
13     void Set(int ary[],int nSize)
14     {
15         b.reset();
16         for(int i = 0 ;i < nSize ;i ++)
17             b.set(ary[i]-1,1);
18     }
19 };
20 
21 int main()
22 {
23     int a[6][10] = {{1,2,3,4,5,6,7,8,9,10},{1,3,4,5,6,7,8,9,10,12},
24     {2,4,6,8,10,13,15,18,19,20},{1,5,6,8,9,10,12,14,18,20},
25     {3,6,7,10,14,15,16,17,18,19},{1,6,8,9,10,12,15,17,18,19}};
26 
27     ofstream out("a.txt");
28 
29     MyNum<24> m;
30 
31     for(int i = 0 ; i < 6 ;i ++)
32     {
33         m.Set(a[i],0);
34         out.write((char *)&m.b,3);
35         cout << i << "\t";
36     }
37 
38     out.close();
39 
40     return 0;
41 
42 }
复制代码

 

set

 

map

 

 

复制代码
 1 #pragma warning(disable : 4786)
 2 #include <iostream>
 3 #include <sstream>
 4 #include <string>
 5 #include <vector>
 6 #include <map>
 7 
 8 using namespace std;
 9 
10 class CWord
11 {
12 private:
13     string mainword;
14     vector<string> vecword;
15 public:
16     CWord(string strLine)
17     {
18         istringstream in(strLine);
19         in >> mainword;
20         string mid = "";
21         while(!in.eof())
22         {
23             in >> mid;
24             vecword.push_back(mid);
25         }
26     }
27 
28     string GetMainWord() { return mainword; }
29     void Show()
30     {
31         cout << endl;
32         cout << "word is :" << "\t" << mainword << endl;
33         cout << "familier word is: " << "\t";
34         for(int i = 0 ;i < vecword.size(); i ++)
35             cout << vecword[i] << "\t";
36         cout << endl;
37     }
38 };
39 
40 class CWordManage
41 {
42     multimap<string,CWord> mymap;
43 public:
44     bool Add(string strLine)
45     {
46         CWord word(strLine);
47         pair<string,CWord>p(word.GetMainWord(),word);
48         mymap.insert(p);
49 
50         return true;
51     }
52 
53     void Show(string strFind)
54     {
55         multimap<string,CWord>::iterator itfind = mymap.find(strFind);
56         if(itfind != mymap.end())
57         {
58             CWord & obj = (*itfind).second;
59             obj.Show();
60         }
61         else
62         {
63             cout << strFind << "hasn't fimiliar word in dic." << endl;
64         }
65     }
66 
67     void Show()
68     {
69         multimap<string,CWord>::iterator te = mymap.begin();
70 
71         while(te != mymap.end())
72         {
73             CWord &obj = (*te).second;
74             obj.Show();
75             te ++;
76         }
77     }
78 };
79 
80 int  main()
81 {
82     string s[5] = {  string("one single unique"),string("correct true right"),
83         string("near close"),string("happy please"),string("strong powerful")};
84 
85     CWordManage manage;
86 
87     for(int i = 0 ; i <  5; i++)
88         manage.Add(s[i]);
89 
90     manage.Show();
91 
92     cout << "***************************************************" << endl;
93     manage.Show("near");
94     cout << "***************************************************" << endl;
95     manage.Show("good");
96 
97     return 0;
98 }
复制代码

 

复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <set>
 5 
 6 using namespace std;
 7 
 8 class CEmployee
 9 {
10 private:
11     string name;
12     string departname;
13 public:
14     CEmployee(string name,string departname)
15     {
16         this -> name = name;
17         this -> departname = departname;
18     }
19 
20     bool operator < (const CEmployee &e) const
21     {
22         bool mark = (departname.compare(e.departname) < 0) ? true : false;
23 
24         if(departname.compare(e.departname) == 0)
25             mark = (name.compare(e.name) < 0) ? true : false;
26 
27         return mark;
28     }
29 
30     string GetName() { return name; }
31     string GetDepart() { return departname; }
32 };
33 
34 class CManage
35 {
36     multiset<CEmployee> myset;
37 public:
38     bool Add(CEmployee &e)
39     {
40         myset.insert(e);
41         return true;
42     }
43 
44     void Show()
45     {
46         multiset<CEmployee>::iterator te = myset.begin();
47 
48         while(te != myset.end())
49         {
50             CEmployee &obj = *te;
51             cout << obj.GetDepart() << "\t" << obj.GetName() << endl;
52             te ++;
53         }
54     }
55 };
56 
57 
58 int  main()
59 {
60     CEmployee e1("zhangdan","renli");
61     CEmployee e2("zhouqi","zhuangpei");
62     CEmployee e3("wangwu","zhizao");
63     CEmployee e4("zhaoliu","zhizao");
64     CEmployee e5("lisi","zhuangpei");
65     CEmployee e6("tianjiu","zhizao");
66 
67     CManage manage;
68     manage.Add(e1);
69     manage.Add(e2);
70     manage.Add(e3);
71     manage.Add(e4);
72     manage.Add(e5);
73     manage.Add(e6);
74 
75     manage.Show();
76 
77     return 0;
78 }
复制代码

 

 STL还有一些预迭代器:

1,插入迭代器

  back_insert_iterator(Cont &x)

  front_insert_iterator(Cont &x)

  insert_iterator(Cont &x,Cont::iterator it)

  back_insert_iterator<Cont>   back_inserter(Cont &x)

  front_insert_iterator<Cont>   frontinserter(Cont &x)

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <iterator>
 4 
 5 using namespace std;
 6 
 7 void display(list<int> &v)
 8 {
 9     for(list<int>::iterator it = v.begin() ; it != v.end() ; it ++)
10         cout << *it << "\t";
11     cout << endl;
12 }
13 
14 
15 int main()
16 {
17     list<int> v;
18 
19     back_insert_iterator<list<int> > backit(v);
20 
21     *backit ++ = 1;
22     *backit ++ = 2;
23 
24     display(v);
25 
26     *back_inserter(v) = 3;
27     *back_inserter(v) = 4;
28 
29     display(v);
30 
31     front_insert_iterator<list<int> > frontit(v);
32 
33     *frontit ++ = 5;
34     *frontit ++ = 6;
35 
36     display(v);
37 
38     *front_inserter(v) ++ = 7;
39     *front_inserter(v) ++ = 8;
40 
41     display(v);
42 
43     list<int>::iterator it = v.begin();
44     for(int i = 0 ;i < 3 ;i ++)
45     {
46         it ++;
47     }
48 
49     insert_iterator<list<int> >insertit(v,it);
50     *insertit ++ = 9;
51 
52     display(v);
53 
54     return 0;
55 }
复制代码

 

2,逆向迭代器

  reverse_iterator(Ranit x)

  reverse_bidirectional_iterator(Bidit x)

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <vector>
 4 #include <iterator>
 5 
 6 using namespace std;
 7 
 8 template<class reverse_iter>
 9 void reverse_display(reverse_iter first,reverse_iter last)
10 {
11     while(first != last)
12     {
13         cout << *first << "\t";
14         first ++;
15     }
16 
17     cout << endl;
18 }
19 
20 int main()
21 {
22     vector<int> v;
23     list<int> l;
24 
25     for(int i = 1 ;i <= 5; i ++)
26     {
27         v.push_back(i);
28         l.push_back(i+5);
29     }
30 
31     cout << "display vector reversely: " << endl;
32     reverse_iterator<vector<int>::iterator,int> first(v.end());
33     reverse_iterator<vector<int>::iterator,int> last(v.begin());
34     reverse_display(first,last);
35 
36     cout << "display list reversely: " << endl;
37     reverse_bidirectional_iterator<list<int>::iterator,int> first2(l.end());
38     reverse_bidirectional_iterator<list<int>::iterator,int> last2(l.begin());
39     reverse_display(first2,last2);
40 
41     return 0;
42 }
复制代码

 

3, 迭代器函数

  template<class InIt,class Dist>

  void advance(Init & it, Dist n);           it += n

 

  template<class Init,class Dist>

  ptrdiff_t distance(Init  first,Init last)            求距离

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int a[] = {1,2,3,4,5,6};
10 
11     list<int> l(a,a+6);
12 
13     cout << "The element in List: ";
14     copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\t"));
15     cout << endl;
16 
17     list<int>::iterator mid = find(l.begin(),l.end(),3);
18 
19     cout << "Element 3's position : " << distance(l.begin(),mid) << endl;
20 
21     advance(mid,2);
22 
23     cout << "Element 3 's ahead 2 is : " << *mid << endl;
24 
25     return 0;
26 }
复制代码

 1 #include <stdio.h>
 2 template<class T>
 3 class MyArray 
 4 {
 5 private:
 6     int m_nTotalSize;
 7     int m_nValidSize;
 8     T * m_pData;
 9 public:
10     MyArray(int nSize = 3)
11     {
12         m_pData = new T[nSize];
13         m_nTotalSize = nSize;
14         m_nValidSize = 0;
15     }
16 
17     void Add(T value)
18     {
19         if(m_nValidSize < m_nTotalSize)
20         {
21             m_pData[m_nValidSize] = value;
22             m_nValidSize ++;
23         }
24     
25         else
26         {
27             T * tmpData = new T[m_nTotalSize];
28             for(int i = 0 ; i < m_nTotalSize ;i ++)
29                 tmpData[i] = m_pData[i];
30             delete []  m_pData;
31             
32             m_nTotalSize *= 2;
33             m_pData = new T[m_nTotalSize];
34             for(int i = 0 ;i < m_nValidSize ;i ++)
35                 m_pData[i] = tmpData[i];
36             delete [] tmpData;
37             m_pData[m_nValidSize] = value;
38             m_nValidSize ++;
39         }
40     }
41 
42     int GetSize()
43     {
44         return m_nValidSize;
45     }
46 
47     T  Get(int pos)
48     {
49         return m_pData[pos];
50     }
51     
52     virtual ~MyArray() 
53     {
54         if(m_pData != NULL)
55         {
56             delete [] m_pData;
57             m_pData = NULL;
58         }
59     }
60 };
61 
62 
63 
64 int main(int argc,char *argv[])
65 {
66     MyArray<int> obj;
67     obj.Add(1);
68     obj.Add(2);
69     obj.Add(3);
70     obj.Add(4);
71     
72     for(int i = 0 ;i < obj.GetSize() ;i ++)
73         printf("%d\n",obj.Get(i));
74     
75     return 0 ;
76 }
复制代码

 

STL标准模板库非常强调 软件复用,traits技术是采用的重要手段。traits中文意思是特性。traits依靠显式模板特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class CIntArray
 5 {
 6     int a[10];
 7 public:
 8 
 9     CIntArray()
10     {
11         for(int i = 0 ;i < 10 ;i ++)
12             a[i] = i + 1 ;
13     }
14 
15     int GetSum(int times)
16     {
17         int sum = 0;
18         for(int i = 0; i < 10 ;i ++)
19             sum += a[i];
20         return sum*times;
21     }
22 };
23 
24 
25 class CFloatArray
26 {
27     float f[10];
28 public:
29     CFloatArray()
30     {
31         for(int i = 1 ;i < 10 ;i ++)
32             f[i-1] = 1.0f/i;
33     }
34 
35     float GetSum(float times)
36     {
37         float sum = 0.0f;
38         
39         for(int i = 0; i < 10 ;i ++)
40             sum += f[i];
41         
42         return sum * times;
43     }
44 };
45 
46 int main() 
47 {
48     CIntArray intary;
49     CFloatArray  fltary;
50     cout << "Int array sum 3 times is :" << intary.GetSum(3) << endl;
51     cout << "Float array sum 3.2 times is :" << fltary.GetSum(3.2f) << endl;
52 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class CIntArray
 5 {
 6     int a[10];
 7 public:
 8 
 9     CIntArray()
10     {
11         for(int i = 0 ;i < 10 ;i ++)
12             a[i] = i + 1 ;
13     }
14 
15     int GetSum(int times)
16     {
17         int sum = 0;
18         for(int i = 0; i < 10 ;i ++)
19             sum += a[i];
20         return sum*times;
21     }
22 };
23 
24 
25 class CFloatArray
26 {
27     float f[10];
28 public:
29     CFloatArray()
30     {
31         for(int i = 1 ;i < 10 ;i ++)
32             f[i-1] = 1.0f/i;
33     }
34 
35     float GetSum(float times)
36     {
37         float sum = 0.0f;
38         
39         for(int i = 0; i < 10 ;i ++)
40             sum += f[i];
41         
42         return sum * times;
43     }
44 };
45 
46 template<class T>
47 class CApply
48 {
49 public:
50     float GetSum(T &t,float inpara)
51     {
52         return t.GetSum(inpara);
53     }
54 };
55 
56 
57 int main() 
58 {
59     CIntArray intary;
60     CFloatArray fltary;
61     CApply<CIntArray> c1;
62     CApply<CFloatArray> c2;
63     cout << "Int array sum 3 times is :" << c1.GetSum(intary,3) << endl;
64     cout << "Float array sum 3.2 times is :" << c2.GetSum(fltary,3.2f) << endl;
65 }
复制代码
复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 class CIntArray
  5 {
  6     int a[10];
  7 public:
  8 
  9     CIntArray()
 10     {
 11         for(int i = 0 ;i < 10 ;i ++)
 12             a[i] = i + 1 ;
 13     }
 14 
 15     int GetSum(int times)
 16     {
 17         int sum = 0;
 18         for(int i = 0; i < 10 ;i ++)
 19             sum += a[i];
 20         return sum*times;
 21     }
 22 };
 23 
 24 
 25 class CFloatArray
 26 {
 27     float f[5];
 28 public:
 29     CFloatArray()
 30     {
 31         for(int i = 1 ;i <= 5 ;i ++)
 32             f[i-1] = 1.0f * i;
 33     }
 34 
 35     float GetSum(float times)
 36     {
 37         float sum = 0.0f;
 38         
 39         for(int i = 0; i < 5 ;i ++)
 40             sum += f[i];
 41         
 42         return sum * times;
 43     }
 44 };
 45 
 46 template<class T>
 47 class NumTraits
 48 {
 49 
 50 };
 51 
 52 template<> class NumTraits<CIntArray>
 53 {
 54 public:
 55     typedef int resulttype;
 56     typedef int inputpara;
 57 };
 58 
 59 template<> class NumTraits<CFloatArray>
 60 {
 61 public:
 62     typedef float  resulttype;
 63     typedef float  inputpara;
 64 };
 65 /*
 66 template<class T>
 67 class CApply
 68 {
 69 public:
 70 //    typedef NumTraits<T>::resulttype result;
 71 //    typedef NumTraits<T>::inputpara inputpara;
 72 
 73     NumTraits<T>::resulttype GetSum(T &obj,NumTraits<T>::inputpara  in)
 74     {
 75         return obj.GetSum(in);
 76     }
 77 };
 78 */
 79 
 80 template<class T>
 81 class CApply
 82 {
 83 public:
 84     typedef typename NumTraits<T>::resulttype result;
 85     typedef typename NumTraits<T>::inputpara inputpara;
 86     result GetSum(T &t,inputpara inpara)
 87     {
 88         return t.GetSum(inpara);
 89     }
 90 };
 91 
 92 int main() 
 93 {
 94     CIntArray intary;
 95     CFloatArray fltary;
 96     CApply<CIntArray> c1;
 97     CApply<CFloatArray> c2;
 98     cout << "Int array sum 3 times is :" << c1.GetSum(intary,3) << endl;
 99     cout << "Float array sum 3 times is :" << c2.GetSum(fltary,3.0f) << endl;
100 }
复制代码

迭代器

 

复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 template<class T>
  5 class MyArray
  6 {
  7 private:
  8     int m_nTotalSize;
  9     int m_nValidSize;
 10     T * m_pData;
 11 public:
 12     MyArray(int nSize = 3)
 13     {
 14         m_pData = new T[nSize];
 15         m_nTotalSize = nSize;
 16         m_nValidSize = 0;
 17     }
 18 
 19     void Add(T value)
 20     {
 21         if(m_nValidSize < m_nTotalSize)
 22         {
 23             m_pData[m_nValidSize] = value;
 24             m_nValidSize ++;
 25         }
 26     
 27         else
 28         {
 29             T * tmpData = new T[m_nTotalSize];
 30             for(int i = 0 ; i < m_nTotalSize ;i ++)
 31                 tmpData[i] = m_pData[i];
 32             delete []  m_pData;
 33             
 34             m_nTotalSize *= 2;
 35             m_pData = new T[m_nTotalSize];
 36             for(int i = 0 ;i < m_nValidSize ;i ++)
 37                 m_pData[i] = tmpData[i];
 38             delete [] tmpData;
 39             m_pData[m_nValidSize] = value;
 40             m_nValidSize ++;
 41         }
 42     }
 43 
 44     int GetSize()
 45     {
 46         return m_nValidSize;
 47     }
 48 
 49     T  Get(int pos)
 50     {
 51         return m_pData[pos];
 52     }
 53 
 54     T * Begin()
 55     {
 56         return m_pData;
 57     }
 58 
 59     T * End()
 60     {
 61         return m_pData + m_nValidSize;
 62     }
 63 
 64     
 65     virtual ~MyArray() 
 66     {
 67         if(m_pData != NULL)
 68         {
 69             delete [] m_pData;
 70             m_pData = NULL;
 71         }
 72     }
 73 };
 74 
 75 template<class  T>
 76 struct Unit
 77 {
 78     T value;
 79     Unit * next;
 80 };
 81 
 82 template<class T>
 83 class MyLink
 84 {
 85     Unit<T> * head;
 86     Unit<T> * tail;
 87     Unit<T> * prev;
 88 
 89 public:
 90     MyLink() 
 91     {
 92         head = tail = prev = NULL;
 93     }
 94 
 95     void Add(T &value)
 96     {
 97         Unit<T> * u = new Unit<T>();
 98         u -> value = value;
 99         u -> next = NULL;
100         if(head == NULL)
101         {
102             head =  u;
103             prev = u;
104         }
105         else
106         {
107             prev -> next = u;
108             prev = u;
109         }
110         tail = u -> next;
111     }
112 
113     Unit<T> * Begin()
114     {
115         return head;
116     }
117 
118     Unit<T> * End()
119     {
120         return tail;
121     }
122     
123     virtual ~ MyLink() 
124     {
125         if(head != NULL)
126         {
127             Unit<T> * prev = head;
128             Unit<T> * next = NULL;
129             while( prev != tail)
130             {
131                 next = prev -> next;
132                 delete prev;
133                 prev = next;
134             }
135         }
136     }
137 };
138 
139 
140 template<class Init>
141 class ArrayIterator
142 {
143     Init * init;
144 public:
145     ArrayIterator(Init * init)
146     {
147         this -> init = init;
148     }
149         
150     bool operator != (ArrayIterator & it)
151     {
152         return this->init <= it.init;
153     }
154 
155     void operator ++ (int)
156     {
157         init ++;
158     }
159 
160     Init operator*()
161     {
162         return *init;
163     }
164 };
165 
166 template<class Init>
167 class LinkIterator
168 {
169     Init * init;
170 public:
171     LinkIterator(Init *init)
172     {
173         this -> init = init;
174     }
175 
176     bool operator != (LinkIterator & it)
177     {
178         return this->init != it.init;
179     }
180 
181     void operator ++ (int)
182     {
183         init = init->next;
184     }
185     
186     Init operator * ()
187     {
188         return *init;
189     }
190 };
191 
192     
193 template<class T>
194 ostream & operator << (ostream &os ,Unit<T> &s)
195 {
196     os << s.value;
197     return os;
198 }
199 
200 
201 
202 template<class Init>
203 void display(Init start,Init end)
204 {
205     cout << endl;
206     for(Init mid = start ; mid != end ; mid ++)
207         cout << *mid << '\t';
208     cout << endl;
209 }
210 
211 /*
212 int main() 
213 {
214     MyArray<int> ary;
215     for(int i = 0; i < 5 ;i ++)
216     {
217         ary.Add(i + 1);
218     }
219     ArrayIterator<int> start(ary.Begin());
220     ArrayIterator<int> end(ary.End());
221     cout << "Array element is: ";
222     display(start,end);
223 
224     return 0;
225 }
226 */
227 int main()
228 {
229     int m = 0;
230     MyLink<int> ml;
231     for(int i = 0;i < 5 ;i ++)
232     {
233         m = i + 1;
234         ml.Add(m);
235     }
236     
237     LinkIterator<Unit<int> > start(ml.Begin());
238     LinkIterator<Unit<int> > end(ml.End());
239 
240     display(start,end);
241 
242     return 0;
243 }
复制代码

 

复制代码
  1 #include <iostream>
  2 using namespace std;
  3 
  4 
  5 template<class T>
  6 class MyLink
  7 {
  8 public:
  9     struct Unit
 10     {
 11         T value;
 12         Unit * next;
 13     };
 14 
 15 class LinkIterator
 16 {
 17     Unit *init;
 18 public:
 19     LinkIterator(Unit *init)
 20     {
 21         this -> init = init;
 22     }
 23 
 24     bool operator != (LinkIterator &it)
 25     {    
 26         return this->init != it.init;
 27     }
 28 
 29     void operator ++ (int)
 30     {
 31         init = init -> next;
 32     }
 33     
 34     Unit operator * ()
 35     {
 36         return *init;
 37     }
 38 };
 39 
 40     Unit * head;
 41     Unit * tail;
 42     Unit * prev;
 43 
 44 public:
 45     MyLink() 
 46     {
 47         head = tail = prev = NULL;
 48     }
 49 
 50     void Add(T &value)
 51     {
 52         Unit * u = new Unit();
 53         u -> value = value;
 54         u -> next = NULL;
 55         if(head == NULL)
 56         {
 57             head =  u;
 58             prev = u;
 59         }
 60         else
 61         {
 62             prev -> next = u;
 63             prev = u;
 64         }
 65         tail = u -> next;
 66     }
 67 
 68     Unit * Begin()
 69     {
 70         return head;    
 71     }
 72     
 73     Unit * End()
 74     {
 75         return tail;
 76     }
 77 
 78     virtual ~ MyLink() 
 79     {
 80         if(head != NULL)
 81         {
 82             Unit* prev = head;
 83             Unit* next = NULL;
 84             while( prev != tail)
 85             {
 86                 next = prev -> next;
 87                 delete prev;
 88                 prev = next;
 89             }
 90         }
 91     }
 92 };
 93 
 94 
 95 template<class T>
 96 ostream & operator << (ostream &os, typename MyLink<T>::Unit & s)
 97 {
 98     os << s.value;
 99     return os;
100 }
101 
102 template<class Init>
103 void display(Init start,Init end)
104 {
105     cout << endl;
106     for(Init mid = start ; mid != end ; mid ++)
107         cout << *mid << '\t' ;
108 
109     cout << endl;
110 }
111 
112 int main()
113 {
114     int m = 0;
115     MyLink<int> ml;
116 
117     for(int i = 0; i < 5 ;i ++)
118     {
119         m = i + 1;
120         ml.Add(m);
121     }
122 
123     MyLink<int>::LinkIterator start = ml.Begin();
124     MyLink<int>::LinkIterator end = ml.End;
125     display(start,end);
126 
127     return 0;
128 }
复制代码

 

STL迭代器:

复制代码
 1 #include <iostream>
 2 #include <iterator>
 3 using namespace std;
 4 
 5 int main(int argc,char * argv[])
 6 {
 7     cout << "Please input data: ";
 8     istream_iterator<int> a(cin);
 9 
10     istream_iterator<int> b;
11     
12     while(1)
13     {
14         cout << *a << endl;
15         a ++;
16         if( a == b)
17             break;
18     }
19 
20     return 0;
21 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <iterator>
 3 using namespace std;
 4 
 5 int main(int argc,char * argv[])
 6 {
 7     cout << "ostream_iterator result: ";
 8     ostream_iterator<int> myout(cout,"\t");
 9     
10     *myout = 1;
11     myout ++;
12     *myout = 2;
13     myout ++;
14     *myout = 3;
15 
16     return 0;
17 }
复制代码

 

 

输入输出流

 

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() 
 5 {
 6     int i;
 7     float f;
 8     char str[20];
 9     
10     cin >> i ;
11     cin >> f;
12     cin >> str;
13 
14     cout << "i = " << i << endl;
15     cout << "f = " << f << endl;
16     cout << "str = " << str << endl;
17 
18     return 0;
19 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int i ;
 7     char str[20];
 8 
 9     cout << "Please input a integer and a string: ";
10     cin >> i >> str;
11     
12     cout << "i = " << i << endl;
13     cout << "str = " << str << endl;
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char szBuf[60];
 7     cout << "Please input a string: ";
 8     int n = cin.get();
 9     cin.getline(szBuf,60);
10     cout << n << endl;
11     cout << "The received string is :" << szBuf << endl;
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() 
 5 {
 6     int a; 
 7     cout << "Please input a data: ";
 8     cin >> a ;
 9     cout << "state is : " << cin.rdstate() << endl;
10 
11     if(cin.good())
12         cout << "the type inputed is right,no error!" << endl;
13     if(cin.fail()) 
14         cout << "the type inputed is wrong,is error!" << endl;
15     if(cin.bad())
16         cout << "deadly wrong!!!" << endl;
17     else
18         cout << "can go on!" << endl;
19 
20     return 0;
21 }  
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a;
 7     
 8     while(1)
 9     {
10         cin >> a;
11         if(cin.fail())
12         {    
13             cout << "Input error ! again ..." << endl;
14             cin.clear();
15             cin.get();
16         }
17         else
18         {
19             cout << a << endl;
20             break;
21         }
22     }
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main() 
 6 {
 7     char szBuf[80];
 8     ifstream in("iostream.cpp");
 9     if(!in)
10         return 0;
11     while(in.getline(szBuf,80))
12     {
13         cout << szBuf << endl;
14     }
15 
16     in.close();
17     
18     return 0;
19 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 struct STUDENT
 7 {    
 8     char strName[20];
 9     int nGrade;
10 };
11 
12 int  main()
13 {
14     ofstream out;
15     out.open("a.txt");
16     STUDENT st1={"zhangsan",90};
17     STUDENT st2={"lisi",80};
18     
19     out << st1.strName << "\t" << st1.nGrade << endl;
20     out << st2.strName << "\t" << st1.nGrade << endl;
21 
22     out.close();
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 struct STUDENT
 7 {    
 8     char strName[20];
 9     int nGrade;
10 };
11 
12 int  main()
13 {
14     ofstream out;
15     out.open("b.txt");
16     STUDENT st1={"zhangsan",90};
17     STUDENT st2={"lisi",80};
18     
19     out.write((const char *)&st1,sizeof(STUDENT));
20     out.write((const char *)&st2,sizeof(STUDENT));
21 
22     out.close();
23 
24     return 0;
25 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct STUDENT
 6 {
 7     char strName[20];
 8     int nGrade;
 9 };
10 
11 int main() 
12 {
13     ifstream in;
14     in.open("b.txt");
15     if(!in)
16         return 0;
17     
18     STUDENT st1;
19     STUDENT st2;
20 
21     in.read((char*)&st1,sizeof(STUDENT));
22     in.read((char*)&st2,sizeof(STUDENT));
23 
24     cout << st1.strName << "\t" << st1.nGrade << endl;
25     cout << st2.strName << "\t" << st2.nGrade << endl;
26 
27     in.close();
28     
29     return 0 ;
30 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     ifstream fin("b.txt");
 8     if(fin != NULL)
 9     {
10         cout << fin.rdbuf();
11     }
12 
13     fin.close();
14 }
复制代码
复制代码
 1 #include <fstream>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     fstream in_out;
 8     in_out.open("sb.txt",ios::in | ios::out | ios::trunc);
 9     in_out.write("Hello",5);
10 
11     in_out.seekg(0,ios::beg);
12     cout << in_out.rdbuf();
13     in_out.close();
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     float f;
10     string strHello;
11 
12     string strText = "1 3.14 hello";
13     istringstream s(strText);
14     s >> n;
15     s >> f;
16     s >> strHello;
17 
18     cout << "n= " << n << endl;
19     cout << "f= " << f << endl;
20     cout << "strHello= " << strHello << endl;
21 
22     return 0;
23 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     cout << "type an int,a float and a string: ";
 8     int i;
 9     float f;
10     string stuff;
11     cin >> i >> f;
12     getline(cin,stuff);
13     ostringstream os;
14     os << "integer=" << i << endl;    
15     os << "float = " << f << endl;
16     os << "string = " << stuff << endl;
17 
18     string result = os.str();
19     cout << result << endl;
20 
21     return 0;
22 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 class Student
 6 {
 7 public:
 8     string strName;
 9     string strSex;
10     int nAge;
11 };
12 
13 istream &  operator >> (istream &is,Student &s)
14 {
15     is >> s.strName >> s.strSex >> s.nAge;
16     return is;
17 }
18 
19 ostream & operator << (ostream &os,Student &s)
20 {
21     os << s.strName << "\t" << s.strSex << "\t" << s.nAge << endl;
22     return os;
23 }
24 
25 ostream & operator << (ostream &os,const Student &s)
26 {
27     cout << "const Student output is: " << endl;
28     os << s.strName << "\t" << s.strSex << "\t" << s.nAge << endl;
29     return os;
30 }
31 
32 void f(const Student &s)
33 {
34     
35     cout << s;
36 }
37 
38 int main(int argc, char *argv[])
39 {
40     Student s;
41     cout << "Please input data(name,sex,age): ";
42     cin >> s;
43     cout << "Input data is: ";
44     cout << s;
45 
46     return 0;
47 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <string>
 5 
 6 
 7 using namespace std;
 8 
 9 
10 int main(int argc,char *argv[])
11 {    
12     ifstream in("sb.txt");
13     
14     string strText;
15     string strName;
16     int nYuwen;
17     int nMath;
18     int nForeign;
19     int nTotal;
20     
21     while(!in.eof())
22     {
23         getline(in,strText);
24         istringstream inf(strText);
25     
26         inf >> strName >> nYuwen >> nMath >> nForeign;
27 
28         nTotal = nYuwen + nMath + nForeign;
29     
30         cout << strName <<"\t\t\t" << nYuwen << "\t\t\t" << nMath << "\t\t\t" << nForeign << "\t\t\t" << nTotal << endl;
31     }
32 
33     in.close();
34 
35     return 0;
36 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 class Student
 9 {
10 public:
11     string strName;
12     int nYuwen;
13     int nMath;
14     int nForeign;
15 };
16 
17 
18 istream &operator >> (istream & is,Student &s)
19 {
20     is >> s.strName >> s.nYuwen >> s.nMath >> s.nForeign;
21     return is;
22 }
23 
24 ostream &operator << (ostream &os, Student &s)
25 {
26     int nTotal = s.nYuwen + s.nMath + s.nForeign;
27     os << s.strName << "\t" << s.nYuwen << "\t" << s.nMath <<  "\t" << s.nForeign << "\t" << nTotal << endl;
28     return os;
29 }
30 
31 int main()
32 {
33     ifstream in("sb.txt");
34     Student s;
35     
36     while(!in.eof())
37     {
38         in >> s;
39         cout << s;
40     }
41 
42     in.close();
43     
44     return 0;
45 }
复制代码

 

 

字符串

字符串类减少了C语言编程中三种常见且最具破坏性的错误:

1,超越数组边界

2,通过未被初始化或被赋以错误值的指针来访问数组元素

3,在释放了某一数组原先所分配的存储单元后仍保留了“悬挂”指针

复制代码
 1 #include <string>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     string s1;
 7     string s2("How are you?");
 8     string s3(s2);
 9     string s4(s2,0,3);
10     string s5("Fine");
11     string s6=s2+"Fine";
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "How are you?";
 8     string s2(s1.begin(),s1.end());
 9     string s3(s1.begin()+4,s1.begin()+7);
10 
11     cout << s1 << endl << s2 << endl << s3 << endl;
12     return 0;
13 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = "do";
 8     cout << "Inition size is: " << s.size() << endl;
 9     s.insert(0,"How ");
10     s.append(" you");
11     s = s + " do?";
12 
13     cout << "final size is: " << s.size() << endl;
14 
15     cout << s;
16 
17     return 0 ;
18 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string s = "what's your name?";
 9     cout << "Before replace : " << s << endl;
10     s.replace(7,4,"her");
11     cout << "After repalce  : " << s << endl;
12 
13     return 0 ;
14 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = " what's your name? my name is TOM. How do you do ? Fine,thanks. ";
 8     int n = s.find("your");
 9     cout << "the first your pos: " << n << endl;
10     n = s.find("you",15);
11     cout << "the first your pos begin from 15:" << n << endl;
12     n = s.find_first_of("abcde");
13     cout << "find pos when character within abcde: " << n << endl;
14     n = s.find_last_of("abcde",3);
15     cout << "find last pos begin from 2 when character within abcde: " << n << endl;
16 
17     n = s.find_first_not_of("abcde");
18     cout << "find pos when character without abcde: " << n << endl;
19     n = s.find_last_not_of("abcde");
20     cout << "find last pos when character without abcde: " << n << endl;
21 
22     
23     return 0;
24 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "How are you?";
 8     s1.erase(s1.begin(),s1.begin()+3);
 9     cout << "after erase to s1 is : " << s1 << endl;
10     
11     string s2 = "Fine, thanks";
12     s2.erase(s2.begin(),s2.end());
13     cout << "after erase to s2 is: " << s2 << endl;
14 
15     return 0;
16 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s1 = "this";
 8     string s2 = "that";
 9     
10     if(s1 > s2)
11         cout << "s1>s2" << endl;
12     if(s1 == s2)
13         cout << "s1 = s2" << endl;
14     if(s1 < s2)
15         cout << "s1 < s2" << endl;
16 
17     return 0;
18 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 #include <sstream>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     int n1 = 10 ;
10     string s1;
11     stringstream os1;
12     os1 << n1;
13     os1 >> s1;
14 
15     cout << "make integer 10 to string 10: " << s1 << endl;
16 
17     int n2 = 0;
18     string s2 = "123";
19     stringstream os2;
20     os2 << s2;
21     os2 >> n2;
22     cout << "make string 123 to integer 123: " << n2 << endl;
23 
24     return 0 ;
25 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string strText = "How are you?";
 8     string strSeparator = " ";
 9     string strResult;
10     int size_pos = 0;
11     int size_prev_pos = 0 ; 
12     
13     while((size_pos = strText.find_first_of(strSeparator,size_pos)) != string::npos)
14     {
15         strResult = strText.substr(size_prev_pos,size_pos - size_prev_pos);
16         
17         cout << "string = " << strResult << endl;
18         size_prev_pos = ++ size_pos;
19     }
20 
21     if(size_prev_pos != strText.size())
22     {
23         strResult = strText.substr(size_prev_pos,size_pos - size_prev_pos);
24         cout << "string = " << strResult << endl;
25     }
26 
27     return 0;
28 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string strResult = " ";
 9     string strText = "How are you";
10     istringstream istr(strText);
11     
12     while(!istr.eof())
13     {
14         istr >> strResult;
15         cout << "string = " << strResult << endl;
16     }
17 
18     return 0 ;
19 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string strResult = " ";
 9     string strText = "How,are,you";
10     
11     istringstream istr(strText);
12     
13     while(! istr.eof())
14     {
15         getline(istr,strResult,',');
16         cout << "string = " << strResult << endl;
17     }
18 
19     return 0;
20 }
复制代码
复制代码
 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string s = " hello  ";
 8     s.erase(0,s.find_first_not_of(" "));
 9     s.erase(s.find_last_not_of(" ")+1);
10     
11     cout << s ;
12     
13     return 0;
14 }
复制代码
复制代码
 1 #include <string>
 2 #include <sstream>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 class ext_string : public string
 7 {
 8 public:
 9     int GetInt(string strText)
10     {
11         int n = 0;
12         stringstream os;
13         os << strText;
14         os >> n;
15         return n;
16     }
17 
18     string GetString(int n)
19     {
20         string s;
21         stringstream os;
22         os << n;
23         os >> s;
24     
25         return s;
26     }
27 
28     string GetTrim(string strText)
29     {
30         strText.erase(0,strText.find_first_not_of(" "));
31         strText.erase(strText.find_last_not_of(" ") + 1);
32         return strText;
33     }
34 };
35 
36 int main()
37 {
38     ext_string extstring;
39     int n = extstring.GetInt("123");
40     string s1 = extstring.GetString(456);
41     string s2 = extstring.GetTrim("   hello               ");
42     
43     cout << "The string '123' convert to integer is: " << n << endl;
44     cout << "The integer 456 convert to string is : " << s1 << endl;
45     cout << "The string erase space is : " << s2 << endl;
46 
47     return 0 ;
48 }
复制代码

 

 

函数对象

函数对象是重载了 oprator()的类的一个实例,operator()是函数调用运算符。标准C++库根据operator()参数个数为0个,1个,2个加以划分,主要有下3中类型:

发生器:         一种没有参数且返回一个任意类型值的函数对象,例如随机数发生器

一元函数:     一种只有一个任意类型的参数,且返回一个可能不同类型值的函数对象

二元函数:     一种有两个任意类型的参数,且返回一个任意类型值的函数对象

一元判定函数: 返回bool型值的一元函数

二元判定函数: 返回bool型值的二元函数

 

可见,函数对象最多仅适用于两个参数

STL中一元函数基类是一个模板类:

template<class _A,class _R>

struct unary_function

{

             typedef  _A  argument_type;

             typedef  _B  result_type;

};

 

例子:

复制代码
 1 #include <algorithm>
 2 #include <iostream>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 
 8 class CSum
 9 {
10 private:
11     int sum;
12 public:
13     CSum() { sum = 0;}
14 
15     void operator()(int n)
16     {    
17         sum += n;
18     }
19 
20     int GetSum() { return sum;}
21 };
22 
23 
24 int main()
25 {
26     vector<int> v;
27     for(int i = 1;i <= 100 ;i ++)
28     {
29         v.push_back(i);
30     }
31 
32     CSum sObj = for_each(v.begin(),v.end(),CSum());
33     
34     cout << "sum = " << sObj.GetSum() << endl;
35 
36     return 0;
37 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 #include <vector>
 5 using namespace std;
 6 
 7 template<class _inPara,class _outPara> 
 8 class CSum : public unary_function<_inPara, _outPara>
 9 {
10 public:
11     _outPara sum;
12     CSum()  { sum =  0; }
13     void operator() (_inPara n)
14     {
15         sum += n;
16     }
17 
18     _outPara GetSum() { return sum; }
19 };
20 
21 int main()
22 {
23     vector<int> v;
24     
25     for(int i = 1; i <= 100; i ++)
26         v.push_back(i);
27 
28     CSum<int,int> sObj = for_each(v.begin(),v.end(),CSum<int,int>());
29     cout << "sum(int) = " << sObj.GetSum() << endl;
30 
31     vector<float> v2;
32     float f = 1.3f;
33     for(int i = 1 ;i<= 99 ;i ++)
34     {
35         v2.push_back(f);
36         f += 1.0f;
37     }
38 
39     CSum<float,float> sObj2 = for_each(v2.begin(),v2.end(),CSum<float,float>() );
40     cout << "sum(float) = " << sObj2.GetSum() << endl;
41 
42     return 0;
43 }
复制代码

 

STL中二元函数基类是一个模板类:

template<class Arg1,class Arg2,class Result>

struct binary_function

{

             typedef  Arg1  first_argument_type;

             typedef  Arg2  second_argument_type;

             typedef  Result  result_type;

};

X

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <string>
 6 #include <iterator>
 7 using namespace std;
 8 
 9 
10 class Student
11 {
12 public:
13     string name;
14     int grade;
15 public:
16     Student(string name,int grade)
17     {
18         this -> name = name;
19         this -> grade = grade;
20     }
21 
22     bool operator < (const Student & s) const
23     {
24         return grade < s.grade;
25     }
26 };
27 
28 
29 ostream & operator << (ostream &os,const Student &s)
30 {
31     os << s.name << '\t' << s.grade << endl;
32     return os;
33 }
34 
35 
36 template<class _inPara1,class _inPara2>
37 class binary_sort : public binary_function<_inPara1,_inPara2,bool>
38 {
39 public:
40     bool operator () (_inPara1 in1,_inPara2 in2)
41     {
42         return in1 < in2;
43     }
44 };
45 
46 
47 int main()
48 {
49     Student s1("zhangsan",60);
50     Student s2("lisi",80);
51     Student s3("wangwu",70);
52     Student s4("zhaoliu",90);
53     
54     vector<Student> v;
55     
56     v.push_back(s1);
57     v.push_back(s2);
58     v.push_back(s3);
59     v.push_back(s4);
60 
61     sort(v.begin(),v.end(),binary_sort<Student &,Student &>());
62     copy(v.begin(),v.end(),ostream_iterator<Student>(cout,""));
63 
64     return 0;
65 }
复制代码

 

STL内置函数对象:

复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 
 6 int main()
 7 {
 8     plus<int> plusObj;
 9     minus<int> minusObj;
10     multiplies<int> mulObj;
11     divides<int> divObj;
12     modulus<int> modObj;
13     negate<int> negObj;
14     
15     cout << plusObj(2,4) << endl;
16     cout << minusObj(2,4) << endl;
17     cout << mulObj(2,4) << endl;
18     cout << divObj(2,4) << endl;
19     cout << modObj(5,3) << endl;
20     cout << negObj(4) << endl;
21 
22     cout << plus<int>()(2,4) << endl;
23     cout << minus<int>()(2,4) << endl;
24     cout << multiplies<int>()(2,4) << endl;
25     cout << divides<int>()(2,4) << endl;
26     cout << modulus<int>()(5,3) << endl;
27     cout << negate<int>()(4) << endl;
28 
29     return 0;
30 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class Complex
 6 {
 7 public:
 8     float real;
 9     float virt;
10 public:
11     Complex()
12     {
13         this->real = 0.0f;
14         this->virt = 0.0f;
15     }
16 
17     Complex(float real,float virt)
18     {
19         this -> real = real;
20         this -> virt = virt;
21     }
22 
23     Complex operator + (const Complex &c) const
24     {
25         Complex v;
26         v.real = real + c.real;
27         v.virt = virt + c.virt;
28     
29         return v;
30     }
31 };
32 
33 
34 int main()
35 {
36     Complex c1(1.0f,2.0f);
37     Complex c2(3.0f,4.0f);
38     Complex c3 = c1 + c2;
39     
40     Complex c4 = plus<Complex>()(c1,c2);
41     
42     cout << c3.real << "+" << c3.virt << "i" << endl;
43     cout << c4.real << "+" << c4.virt << "i" << endl;
44 
45     return 0;
46 }
复制代码
复制代码
 1 #include <numeric>
 2 #include <iostream>
 3 #include <functional>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class Complex
 8 {
 9 public:
10     float real;
11     float virt;
12 public:
13     Complex()
14     {
15         this->real = 0.0f;
16         this->virt = 0.0f;
17     }
18 
19     Complex(float real,float virt)
20     {
21         this -> real = real;
22         this -> virt = virt;
23     }
24 
25     Complex operator + (const Complex &c) const
26     {
27         Complex v;
28         v.real = real + c.real;
29         v.virt = virt + c.virt;
30     
31         return v;
32     }
33 };
34 
35 
36 int main()
37 {
38     Complex c1(1.0f,2.0f);
39     Complex c2(3.0f,4.0f);
40     Complex c3 = c1 + c2;
41     
42     Complex c4 = plus<Complex>()(c1,c2);
43     
44     Complex c;
45     
46     vector<Complex> v;
47     v.push_back(c1);
48     v.push_back(c2);    
49      v.push_back(c3);
50     v.push_back(c4);
51     
52     Complex result = accumulate(v.begin(),v.end(),c,plus<Complex>());
53 
54     cout << result.real << "+" << result.virt << "i" << endl;
55 
56     return 0;
57 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     equal_to<int> equalObj;
 9     not_equal_to<int> notequalObj;
10     greater<int> greatObj;
11     greater_equal<int> greatequalObj;
12     less<int> lessObj;
13     less_equal<int> lessequalObj;
14 
15 
16     cout << equalObj(2,4) << endl;
17     cout << notequalObj(2,4) << endl;
18     cout << greatObj(2,4) << endl;
19     cout << greatequalObj(2,4) << endl;
20     cout << lessObj(2,4) << endl;
21     cout << lessequalObj(2,4) << endl;
22 
23     cout << equal_to<int>()(2,4) << endl;
24     cout << not_equal_to<int>()(2,4) << endl;
25     cout << greater<int>()(2,4) << endl;
26     cout << greater_equal<int>()(2,4) << endl;
27     cout << less<int>()(2,4) << endl;
28     cout << less_equal<int>()(2,4) << endl;
29 
30     return 0;
31 }
复制代码
复制代码
 1 #include <functional>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     logical_and<int> andObj;
 8     logical_or<int> orObj;
 9     logical_not<int> notObj;
10     
11     cout << andObj(true,true) << endl;
12     cout << orObj(true,false) << endl;
13     cout << notObj(true) << endl;
14 
15     cout << logical_and<int>()(3<5,6<9);
16     cout << logical_or<int>()(3<5,6<9);
17     cout << logical_not<int>()(3<5);
18 
19     return 0;
20 }
复制代码

 

函数适配器:

1,可以形成复杂的,有语义的表达式

2,可以调用类中普通的成员函数

例子:

复制代码
 1 #include <iterator>
 2 #include <functional>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int a[] = {1,3,5,7,9,8,6,4,2,0};
10     
11     int nCount = count_if(a,a+sizeof(a)/sizeof(int),bind2nd(less<int>(),4));
12     cout << nCount << endl;
13 
14     nCount = count_if(a,a+sizeof(a)/sizeof(int),bind1st(less<int>(),4));
15     cout << nCount << endl;
16 
17     nCount = count_if(a,a+sizeof(a)/sizeof(int),not1(bind2nd(less<int>(),4)));
18     cout << nCount << endl;
19     
20     nCount = count_if(a,a+sizeof(a)/sizeof(int),not1(bind1st(less<int>(),4)));
21     cout << nCount << endl;
22 
23     sort(a,a+sizeof(a)/sizeof(int),not2(less<int>()));
24     copy(a,a+sizeof(a)/sizeof(int),ostream_iterator<int>(cout," "));
25 
26     return 0;
27 }
复制代码

X

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <string>
 6 
 7 using namespace std;
 8 
 9 class Student
10 {
11     string strNO;
12     string strName;
13 public:
14     Student(string strNO,string strName) : strNO(strNO),strName(strName){}
15     bool show()
16     {
17         cout << strNO << ":" << strName << endl;
18         return true;
19     }
20 };
21 
22 int main()
23 {
24     Student s1("1001","zhangsan");
25     Student s2("1002","lisi");
26     
27     vector<Student> v;
28     v.push_back(s1);
29     v.push_back(s2);
30     for_each(v.begin(),v.end(),mem_fun_ref(Student::show));
31     
32     Student *ps1 = new Student("1003","wangwu");
33     Student *ps2 = new Student("1004","zhaoliu");
34     vector<Student *> pv;
35     pv.push_back(ps1);
36     pv.push_back(ps2);
37     
38     for_each(pv.begin(),pv.end(),mem_fun(Student::show));
39 
40     return 0;
41 }
复制代码
复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 bool f(int x)
 7 {
 8     return x > 3;
 9 }
10 
11 bool g(int x,int y)
12 {
13     return x > y;
14 }
15 
16 
17 int main()
18 {
19     int a[] = {2,5,3,7,1,9,8,0,6};
20     
21     int nSize = sizeof(a) / sizeof(int);
22     int nCount = count_if(a,a+nSize,f);
23     cout << nCount << endl;
24 
25     nCount = count_if(a,a+nSize,ptr_fun(f));
26     cout << nCount << endl;
27     
28     nCount = count_if(a,a+nSize,bind2nd(ptr_fun(g),3));
29     cout << nCount << endl;
30 
31     nCount = count_if(a,a+nSize,bind2nd(ptr_fun(g),5));
32     cout << nCount << endl;
33 
34     return 0;
35 }
复制代码

 

复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class Shape
 8 {
 9 public: virtual bool ShowArea() = 0;
10 };
11 
12 class Circle : public Shape
13 {
14     float r;
15 public:
16     Circle(float r) : r(r){}
17     bool ShowArea() {
18         cout << 3.14 * r * r << endl;
19         return true;
20     }
21 };
22 
23 class Rectangle : public Shape
24 {
25     float width,height;
26 public:
27     Rectangle(float width,float height) : width(width),height(height) {}
28     bool ShowArea() {
29         cout << width * height << endl;
30         return true;
31     }
32 };
33 
34 class AreaCollect
35 {
36     vector<Shape *> v;
37 public:
38     bool Add(Shape * pShape)
39     {
40         v.push_back(pShape);
41         return true;
42     }
43 
44     bool ShowEachArea()
45     {
46         for_each(v.begin(),v.end(),mem_fun(Shape::ShowArea));
47         return true;
48     }
49 };
50 
51 int main()
52 {
53     AreaCollect contain;
54     Shape * pObj1 = new Circle(10.0f);
55     Shape * pObj2 = new Rectangle(10.0f,20.0f);
56     
57     contain.Add(pObj1);
58     contain.Add(pObj2);
59     contain.ShowEachArea();
60 
61     return 0;
62 }
复制代码
复制代码
 1 #include <functional>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 #include <iterator>
 6 #include <string>
 7 
 8 using namespace std;
 9 
10 class Student
11 {
12 public:
13     string strNO;
14     int nGrade;
15 public:
16     Student(string strNO,int nGrade) : strNO(strNO),nGrade(nGrade) {}
17 };
18 
19 class StudIndex : public binary_function<int,int,bool>
20 {
21     vector<Student> &vStud;
22 public:
23     StudIndex(vector<Student>&vStud) : vStud(vStud) {}
24 
25     bool operator() (int a,int b)
26     {
27         return vStud.at(a).nGrade < vStud.at(b).nGrade;
28     }
29 };
30 
31 int main()
32 {
33     Student s1("1001",70);
34     Student s2("1002",60);
35     Student s3("1003",80);
36     Student s4("1004",74);
37 
38     vector<Student> v;
39     v.push_back(s1);
40     v.push_back(s2);
41     v.push_back(s3);
42     v.push_back(s4);
43 
44     vector<int> vIndex;
45     vIndex.push_back(0);
46     vIndex.push_back(1);
47     vIndex.push_back(2);
48     vIndex.push_back(3);
49 
50     sort(vIndex.begin(),vIndex.end(),StudIndex(v));
51     copy(vIndex.begin(),vIndex.end(),ostream_iterator<int>(cout," "));
52 
53     return 0;
54 }
复制代码

 

 

 

 

 

 

通用容器

 vector容器

 

复制代码
 1 #include <vector>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> int_vec;
 9 
10     int_vec.push_back(1);
11     int_vec.push_back(2);
12     int_vec.push_back(3);
13 
14     int nSize = int_vec.size();
15 
16     cout << "Array output style : ";
17     for(int i = 0; i < nSize ;i ++)
18     {
19         cout << int_vec[i] << "\t";
20     }
21     cout << endl;
22 
23     cout << "output via reference: ";
24     for(i = 0 ;i < nSize ;i++)
25     {
26         int &nValue = int_vec.at(i);
27         cout << nValue << "\t";
28     }
29     cout << endl;
30 
31     cout << "output via iterator: ";
32     vector<int>::iterator int_vec_iter = int_vec.begin();
33     while(int_vec_iter != int_vec.end())
34     {
35         cout << *int_vec_iter << "\t" ;
36         int_vec_iter ++;
37     }
38 
39     cout << endl;
40 
41     return 0;
42 }
复制代码

 

复制代码
 1 #include <vector>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class A
 6 {
 7 public:
 8     int n;
 9 public:
10     A(int n)
11     {
12         this -> n = n;
13     }
14 };
15 
16 int main()
17 {
18     cout << "Part one: class A vector operator" << endl;
19 
20     vector<A> ca_vec;
21     A a1(1);
22     A a2(2);
23     ca_vec.push_back(a1);
24     ca_vec.push_back(a2);
25     int nSize = ca_vec.size();
26 
27     cout << "\noutput via array:";
28     for(int i = 0 ; i < nSize; i++)
29     {
30         cout << ca_vec[i].n << "\t";
31     }
32     cout << "\noutput via reference: ";
33     for(i = 0 ;i < nSize ;i ++)
34     {
35         A & a = ca_vec.at(i);
36         cout << a.n << "\t";
37     }
38     cout << "\noutput via iterator: ";
39     vector<A>::iterator ca_vec_iter = ca_vec.begin();
40     while(ca_vec_iter != ca_vec.end())
41     {
42         cout << (*ca_vec_iter).n << "\t";
43         ca_vec_iter ++;
44     }
45 
46     cout << "\nPart two: class A pointer vector" << endl;
47 
48     vector<A *> pca_vec;
49 
50     A * pa1 = new A(1);
51     A * pa2 = new A(2);
52 
53     pca_vec.push_back(pa1);
54     pca_vec.push_back(pa2);
55 
56     nSize = pca_vec.size();
57 
58     cout <<"output via array: ";
59     for(i = 0 ; i < nSize ;i ++)
60     {
61         cout << pca_vec[i] -> n << "\t";
62     }
63     
64     cout << "\noutput via reference : ";
65     for(i = 0 ; i < nSize ;i ++)
66     {
67         A * & a = pca_vec.at(i);
68         cout << a->n << "\t";
69     }
70 
71     cout << "\noutput via iterator: ";
72     vector<A *>::iterator pca_vec_iter = pca_vec.begin();
73     while(pca_vec_iter != pca_vec.end())
74     {
75         cout << (**pca_vec_iter).n << "\t";
76         pca_vec_iter ++;
77     }
78 
79     delete pa1;
80     delete pa2;
81 
82     return 0;
83 }
复制代码
复制代码
 1 //modify.cpp
 2 #include <vector>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> int_vec;
 9     int_vec.push_back(1);
10     int_vec.push_back(2);
11     int_vec.push_back(3);
12 
13     cout << "Modify via array: Element two will be modified to  5:";
14     int_vec[1] = 5;
15 
16     for(int i = 0 ; i < int_vec.size() ;i ++)
17         cout << int_vec[i] << "\t";
18     cout << endl;
19 
20 
21     cout << "modify via reference: Element two will be modified to 10:";
22     int &m = int_vec.at(1);
23     m = 10;
24     for(i = 0 ;i < int_vec.size() ; i++)
25         cout << int_vec[i] << "\t";
26     cout << endl;
27 
28     cout << "modify via iterator: Element two will be modified to 20: ";
29     vector<int>::iterator int_vec_iter = int_vec.begin() + 1;
30     *int_vec_iter = 20;
31 
32     for(i = 0 ;i < int_vec.size() ;i++)
33         cout << int_vec[i] << "\t";
34     cout << endl;
35 
36     return 0;
37 }
复制代码
复制代码
 1 //erase.cpp
 2 #include <vector>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     vector<int> int_vec;
10     for(int i = 1 ;i <= 10  ;i++)
11         int_vec.push_back(i);
12 
13     int_vec.erase(int_vec.begin()+4);
14     cout << "erase the fivth element:";
15     for(i = 0 ;i < int_vec.size() ;i ++)
16         cout  << int_vec[i] << "\t";
17     cout  << endl;
18 
19     int_vec.erase(int_vec.begin()+1,int_vec.begin()+5);
20     cout << "erase Element 2 ~ 5: ";
21     for(i = 0 ;i < int_vec.size() ;i ++)
22         cout << int_vec[i] << "\t";
23     cout << endl;
24 
25     return 0;
26 }
复制代码
复制代码
 1 //final1.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 class Student
 9 {
10 public:
11     string m_strNO;
12     string m_strName;
13     string m_strSex;
14     string m_strDate;
15 public:
16     Student(string strNO,string strName,string strSex,string strDate) :
17       m_strNO(strNO),m_strName(strName),m_strSex(strSex),m_strDate(strDate) {}
18 
19       void Display() {
20           cout << m_strNO << "\t" << m_strName << "\t" << m_strSex << "\t" << m_strDate << endl;
21       }
22 };
23 
24 class StudCollect
25 {
26     vector<Student> m_vStud;
27 public:
28     void Add(Student &s) {
29         m_vStud.push_back(s);
30     }
31 
32     Student *Find(string strNO) {
33         bool bFind = false;
34 
35         for(int i = 0 ;i < m_vStud.size(); i ++)
36         {
37             Student &s = m_vStud.at(i);
38             if(s.m_strNO == strNO)
39             {
40                 bFind = true;
41                 break;
42             }
43         }
44 
45         Student *s = NULL;
46         if(bFind)
47             s = &m_vStud.at(i);
48 
49         return s;
50     }
51 };
52 
53 int main() {
54     Student s1("1001","zhangsan","boy","1985-10-10");
55     Student s2("1002","lisi","boy","1984-06-10");
56     Student s3("1003","wangwu","boy","1985-11-15");
57     StudCollect s;
58     s.Add(s1),s.Add(s2),s.Add(s3);
59 
60     Student *ps = s.Find("1002");
61 
62     if(ps)
63         ps->Display();
64 
65     return 0;
66 }
复制代码
复制代码
 1 //final2.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 using namespace std;
 6 
 7 class Book
 8 {
 9     string m_strBookNO;
10     string m_strBookName;
11     string m_strPublic;
12 public:
13     Book(string strNO,string strName,string strPublic):
14     m_strBookNO(strNO),m_strBookName(strName),m_strPublic(strPublic)
15     {
16         ;
17     }
18 };
19 
20 class Writer
21 {
22     string m_strWriteNO;
23     string m_strWriteName;
24     vector<Book>m_vecBook;
25 public:
26     Writer(string strNO,string strName):m_strWriteNO(strNO),m_strWriteName(strName) {}
27     void AddBook(Book &book) {
28         m_vecBook.push_back(book);
29     }
30 };
31 
32 class WriterCollect
33 {
34     vector<Writer> m_vecWriter;
35 public:
36     void AddWriter(Writer & writer) {
37         m_vecWriter.push_back(writer);
38     }
39 };
40 
41 int main() {
42     Writer w1("1001","zhangsan");
43     Book b1("b001","aaa","public");
44     Book b2("b002","bbb","public");
45     w1.AddBook(b1);
46     w1.AddBook(b2);
47 
48     Writer w2("1002","lisi");
49     Book b3("b003","ccc","public");
50     w2.AddBook(b3);
51 
52     WriterCollect collect;
53     collect.AddWriter(w1);
54     collect.AddWriter(w2);
55 
56     return 0;
57 }
复制代码

 

deque容器

 

复制代码
 1 //final2.cpp
 2 #include <iostream>
 3 #include <vector>
 4 #include <string>
 5 using namespace std;
 6 
 7 class Book
 8 {
 9     string m_strBookNO;
10     string m_strBookName;
11     string m_strPublic;
12 public:
13     Book(string strNO,string strName,string strPublic):
14     m_strBookNO(strNO),m_strBookName(strName),m_strPublic(strPublic)
15     {
16         ;
17     }
18 };
19 
20 class Writer
21 {
22     string m_strWriteNO;
23     string m_strWriteName;
24     vector<Book>m_vecBook;
25 public:
26     Writer(string strNO,string strName):m_strWriteNO(strNO),m_strWriteName(strName) {}
27     void AddBook(Book &book) {
28         m_vecBook.push_back(book);
29     }
30 };
31 
32 class WriterCollect
33 {
34     vector<Writer> m_vecWriter;
35 public:
36     void AddWriter(Writer & writer) {
37         m_vecWriter.push_back(writer);
38     }
39 };
40 
41 int main() {
42     Writer w1("1001","zhangsan");
43     Book b1("b001","aaa","public");
44     Book b2("b002","bbb","public");
45     w1.AddBook(b1);
46     w1.AddBook(b2);
47 
48     Writer w2("1002","lisi");
49     Book b3("b003","ccc","public");
50     w2.AddBook(b3);
51 
52     WriterCollect collect;
53     collect.AddWriter(w1);
54     collect.AddWriter(w2);
55 
56     return 0;
57 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <deque>
 4 using namespace std;
 5 
 6 int main() 
 7 {
 8     vector<int> v(2);
 9     v[0] = 10;
10     int *p = &v[0];
11     cout << "In the Vector the first iterator element *p is: " << *p << endl;
12     v.push_back(20);
13     cout << "After varity the vector first iterator element *p is : " << *p << endl;
14 
15     deque<int> d(2);
16     d[0] = 10;
17     int *q = &d[0];
18     cout << "deque first iterator element *q is : " << *q << endl;
19     d.push_back(20);
20     cout << "After varity the deque first iterator element *q is : " << *q << endl;
21 
22     return 0;
23 }
复制代码
复制代码
 1 //final.cpp
 2 #include <iostream>
 3 #include <deque>
 4 using namespace std;
 5 
 6 template<class T>
 7 class MyQueue
 8 {
 9     deque<T> d;
10 public:
11     void push(const T&t)
12     {
13         d.push_back(t);
14     }
15     
16     void pop()
17     {
18         d.pop_front();
19     }
20 
21     int size()
22     {
23         return d.size();
24     }
25 
26     bool empty()
27     {
28         return d.empty();
29     }
30 
31     T &front()
32     {
33         return *d.begin();
34     }
35 
36     T &back()
37     {
38         return *(--d.end());
39     }
40 
41     void display()
42     {
43         for(int i = 0 ;i < d.size() ;i ++)
44             cout << d.at(i) << "\t";
45     }
46 };
47 
48 int main()
49 {
50     MyQueue<int> myqueue;
51     for(int i = 1 ; i <= 5 ;i ++)
52     {
53         myqueue.push(i);
54     }
55 
56     cout << "original queue: ";
57     myqueue.display();
58     cout << endl;
59     myqueue.pop();
60     cout << "After delete the front:";
61     myqueue.display();
62     cout << endl;
63     myqueue.push(6);
64     cout << "After insert element 6: ";
65     myqueue.display();
66     cout << endl;
67 
68     cout << "Current the front element: " << myqueue.front() << endl;
69     cout << "Current the tail elemet : " << myqueue.back() << endl;
70 
71     return 0;
72 }
复制代码

 

list容器

 

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 using namespace std;
 5 
 6 typedef  list<string> LISTSTR;
 7 
 8 int main()
 9 {
10     LISTSTR test;
11 
12     test.push_back("back");
13     test.push_front("middle");
14     test.push_front("front");
15 
16     cout << test.front() << endl;
17     cout << * test.begin() << endl;
18 
19     cout << test.back() << endl;
20     cout << *(test.rbegin()) << endl;
21 
22     test.pop_front();
23     test.pop_back();
24 
25     cout << test.front() << endl;
26 
27     return 0;
28 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4 
 5 typedef list<int> LISTINT;
 6 
 7 int main()
 8 {
 9     LISTINT test;
10 
11     for(int i = 0 ;i < 5 ;i ++)
12         test.push_back(i + 1);
13 
14     LISTINT::iterator it = test.begin();
15 
16     for(; it != test.end() ;it ++)
17         cout << *it << "\t";
18     cout << endl;
19 
20 
21     LISTINT::reverse_iterator rit = test.rbegin();
22 
23     for(; rit != test.rend() ; rit ++)
24     {
25         cout << *rit << "\t";
26     }
27     cout << endl;
28 
29     return 0;
30 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4 
 5 typedef list<int> LISTINT;
 6 
 7 int main()
 8 {
 9     LISTINT t1;
10 
11     t1.push_back(1);
12     t1.push_back(5);
13     t1.push_back(3);
14     t1.push_back(10);
15 
16     LISTINT t2;
17     t2.push_back(2);
18     t2.push_back(8);
19     t2.push_back(6);
20     t2.push_back(9);
21 
22     t1.sort();
23     t2.sort();
24 
25     t1.merge(t2);
26 
27     for(LISTINT::iterator it = t1.begin() ; it != t1.end() ;it ++)
28         cout << *it << "\t";
29 
30     cout << endl;
31 
32     cout << t1.size() << "\t" << t2.size() << endl;
33     
34     return 0 ;
35 }
复制代码
复制代码
  1 #include <iostream>
  2 #include <list>
  3 #include <string>
  4 using namespace std;
  5 
  6 class Student
  7 {
  8 private:
  9     string m_strNO;
 10     string m_strName;
 11     string m_strUniversity;
 12     int m_nTotal;
 13 public:
 14     Student(string strNO,string strName,string strUniversity,int nTotal) : m_strNO(strNO),
 15         m_strName(strName),m_strUniversity(strUniversity),m_nTotal(nTotal)
 16     {
 17         ;
 18     }
 19 
 20     bool operator < (Student &s)
 21     {
 22         return m_strNO < s.GetNO();
 23     }
 24 
 25     bool operator == (Student &s)
 26     {
 27         return m_strNO == s.GetNO();
 28     }
 29 
 30     string GetNO() { return m_strNO; }
 31     string GetName() { return m_strName; }
 32     string GetUniversity() { return m_strUniversity; }
 33 
 34     int GetTotal() { return m_nTotal; }
 35 };
 36 
 37 ostream & operator << (ostream &os,Student &s)
 38 {
 39     os << s.GetNO() << "\t" << s.GetName() << "\t" << s.GetUniversity() << "\t" << s.GetTotal();
 40     return os;
 41 }
 42 typedef list<Student> LISTSTUD;
 43 
 44 class StudManage
 45 {
 46 private:
 47     LISTSTUD m_stlList;
 48 public:
 49     bool Add(const Student &s)
 50     {
 51         m_stlList.push_back(s);
 52         return true;
 53     }
 54 
 55     bool Merge(StudManage & stud)
 56     {
 57         m_stlList.sort();
 58         stud.m_stlList.sort();
 59         m_stlList.merge(stud.m_stlList);
 60         m_stlList.unique();
 61 
 62         return true;
 63     }
 64 
 65     void Show()
 66     {
 67         for(LISTSTUD::iterator it = m_stlList.begin() ; it != m_stlList.end() ; it ++)
 68             cout << *it << endl;
 69     }
 70 };
 71 
 72 
 73 int main()
 74 {
 75     StudManage sm1;
 76     StudManage sm2;
 77 
 78     Student s1("1001","zhangsan","tsinghua",670);
 79     Student s2("1002","lisi","beida",660);
 80     Student s3("1003","wangwu","fudan",650);
 81     Student s4("1004","zhaoliu","nankai",640);
 82     Student s5("1005","zhouqi","tongji",630);
 83 
 84 
 85     sm1.Add(s1);
 86     sm1.Add(s2);
 87     sm1.Add(s5);
 88 
 89     sm2.Add(s5);
 90     sm2.Add(s4);
 91     sm2.Add(s3);
 92     sm2.Add(s1);
 93 
 94 
 95     sm1.Merge(sm2);
 96 
 97     sm1.Show();
 98 
 99     return 0;
100 }
复制代码
复制代码
  1 #include <iostream>
  2 #include <list>
  3 #include <string>
  4 
  5 using namespace std;
  6 
  7 class Term
  8 {
  9 private:
 10     int coef;
 11     int exp;
 12 public:
 13     Term(int coef,int exp) : coef(coef),exp(exp)
 14     {
 15         ;
 16     }
 17 
 18     int GetCoef() { return coef; }
 19     int GetExp() { return exp; }
 20     bool operator < (Term &t)
 21     {
 22         return exp < t.GetExp();
 23     }
 24 };
 25 
 26 typedef list<Term>LISTTERM;
 27 
 28 ostream & operator<<(ostream &os,Term &t)
 29 {
 30     os << t.GetCoef() << "x" << t.GetExp();
 31     return os;
 32 }
 33 
 34 class Polynomial
 35 {
 36 private:
 37     LISTTERM m_stlTermList;
 38 public:
 39     bool AddTerm(const Term & t)
 40     {
 41         m_stlTermList.push_back(t);
 42         return true;
 43     }
 44 
 45     Polynomial AddPolynomial(Polynomial & obj)
 46     {
 47         Polynomial  result;
 48 
 49         m_stlTermList.sort();
 50         obj.m_stlTermList.sort();
 51 
 52         LISTTERM::iterator src = m_stlTermList.begin();
 53         LISTTERM::iterator des = obj.m_stlTermList.begin();
 54 
 55         int coef = 0 ;
 56         int exp = 0;
 57 
 58         while((src != m_stlTermList.end()) && (des != obj.m_stlTermList.end()))
 59         {
 60             int nCurExp1 = (*src).GetExp();
 61             int nCurExp2 = (*des).GetExp();
 62 
 63             if(nCurExp1 == nCurExp2)
 64             {
 65                 coef = (*src).GetCoef() + (*des).GetCoef();
 66                 exp = (*src).GetExp();
 67                 src ++;
 68                 des ++;
 69             }
 70 
 71             if(nCurExp1 < nCurExp2)
 72             {
 73                 coef = (*src).GetCoef();
 74                 exp = (*src).GetExp();
 75 
 76                 src ++;
 77             }
 78 
 79             if(nCurExp1 > nCurExp2)
 80             {
 81                 coef = (*des).GetCoef();
 82                 exp = (*des).GetExp();
 83 
 84                 des ++;
 85             }
 86 
 87             if(coef != 0)
 88             {
 89                 Term t(coef,exp);
 90 
 91                 result.AddTerm(t);
 92             }
 93         }
 94 
 95         if(src != m_stlTermList.end())
 96         {
 97             LISTTERM temp(src,m_stlTermList.end());
 98             result.m_stlTermList.splice(result.m_stlTermList.end(),temp);
 99         }
100 
101         if(des != m_stlTermList.end())
102         {
103             LISTTERM temp(des,obj.m_stlTermList.end());
104             result.m_stlTermList.splice(result.m_stlTermList.end(),temp);
105         }
106 
107         return result;
108     }
109 
110     void Show()
111     {
112         LISTTERM::iterator it = m_stlTermList.begin();
113         while(it != m_stlTermList.end())
114         {
115             cout << *it << " + ";
116 
117             it ++;
118         }
119     }
120 };
121 
122 int main()
123 {
124     Polynomial p1;
125     Polynomial p2;
126 
127     Term t1(2,6);
128     Term t2(3,4);
129     Term t3(5,2);
130     Term t4(6,0);
131 
132     p1.AddTerm(t1);
133     p1.AddTerm(t2);
134     p1.AddTerm(t3);
135     p1.AddTerm(t4);
136 
137     Term t5(2,5);
138     Term t6(-3,4);
139     Term t7(5,2);
140     Term t8(8,0);
141 
142     p2.AddTerm(t5);
143     p2.AddTerm(t6);
144     p2.AddTerm(t7);
145     p2.AddTerm(t8);
146 
147     Polynomial p3 = p1.AddPolynomial(p2);
148 
149     p3.Show();
150 
151     return 0;
152 }
复制代码

 

 

queue && stack

 

 

复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <vector>
 5 #include <list>
 6 #include <stack>
 7 
 8 using namespace std;
 9 
10 void PrintStack(stack<int,vector<int> >obj)
11 {
12     while(!obj.empty())
13     {
14         cout << obj.top() << "\t";
15         obj.pop();
16     }
17 }
18 
19 void PrintStack(stack<string,list<string> >obj)
20 {
21     while(!obj.empty())
22     {
23         cout << obj.top() << "\t";
24         obj.pop();
25     }
26 }
27 
28 template<class T,class Container>
29 void PrintStack(stack<T,Container> obj)
30 {
31     while(!obj.empty())
32     {
33         cout << obj.top() << "\t";
34         obj.pop();
35     }
36 }
37 
38 int main()
39 {
40     stack<int,vector<int> > s;
41     for(int i = 0 ;i < 4 ;i ++)
42         s.push(i+1);
43 
44     PrintStack(s);
45     cout << endl;
46 
47     string str = "a";
48     stack<string,list<string> > t;
49     for(i = 0 ; i < 4 ;i ++)
50     {
51         t.push(str);
52         str += "a";
53     }
54     PrintStack(t);
55     cout << endl;
56 
57     stack<float,deque<float> > u;
58     for(i = 0 ;i < 4 ;i ++)
59         u.push(i+1);
60     PrintStack(u);
61 
62     return 0;
63 }
复制代码
复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <list>
 5 #include <deque>
 6 #include <queue>
 7 using namespace std;
 8 
 9 template<class T,class Container>
10 void PrintQueue(queue<T,Container> obj)
11 {
12     while(!obj.empty())
13     {
14         cout << obj.front() << "\t";
15         obj.pop();
16     }
17 }
18 
19 
20 int main()
21 {
22     string str = "a";
23     queue<string,deque<string> >t;
24 
25     for(int i =  0 ; i < 4; i ++)
26     {
27         t.push(str);
28         str += "a";
29     }
30     PrintQueue(t);
31     cout << endl;
32 
33     queue<float,list<float> > u;
34     for(i = 0 ;i < 4 ;i ++)
35     {
36         u.push(i + 1);
37     }
38 
39     PrintQueue(u);
40 
41     return 0;
42 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <deque>
 3 #include <stack>
 4 using namespace std;
 5 
 6 
 7 template<class T,class Container=deque<T> >
 8 class mystack : public stack<T,Container>
 9 {
10 private:
11     int m_nMaxSize ;
12 public:
13     mystack(int maxsize)
14     {
15         m_nMaxSize = maxsize;
16     }
17 
18     void push(const T &t)
19     {
20         if(this->size() < m_nMaxSize)
21         {
22             stack<T,Container>::push(t);
23         }
24         else
25         {
26             cout << "stack is fill." << "the term " << t << " is not pushed" << endl;
27         }
28     }
29 };
30 
31 
32 int main()
33 {
34     mystack<int,deque<int> >obj(2);
35 
36     obj.push(1);
37     obj.push(2);
38     obj.push(3);
39 
40     return 0 ;
41 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 class CExpress
 8 {
 9 private:
10     string m_strExpress;
11 public:
12     CExpress(string strExpress) : m_strExpress(strExpress)
13     {}
14     
15     bool IsValid()
16     {
17         bool flag = true;
18         char ch = 0 ;
19         char chstack = 0;
20         stack<char>sta_char;
21         int size = m_strExpress.length();
22 
23         for(int i = 0 ;i < size ;i ++)
24         {
25             ch = m_strExpress.at(i);
26             if(ch == '(' || ch == '[')
27                 sta_char.push(ch);
28             if(ch == ')' || ch == ']')
29                 if(sta_char.empty())
30                 {
31                     flag = false;
32                     break;
33                 }
34                 else
35                 {
36                     chstack = sta_char.top();
37                     if(chstack == '(' && ch == ')' )
38                         sta_char.pop();
39                     else if(chstack == '[' && ch == ']')
40                         sta_char.pop();
41                     else
42                     {
43                         flag = false;
44                         break;
45                     }
46                  }
47         }
48 
49         if(flag == true && !sta_char.empty())
50             flag = false;
51     
52         return flag;
53     }
54 };
55 
56 int main()
57 {
58     CExpress c1(")[]");
59     CExpress c2("([]");
60     CExpress c3("()[");
61     CExpress c4(")([]");
62     CExpress c5("([]())");
63 
64     c1.IsValid() == true ? cout << "c1 is right" << endl : cout << "c1 is wrong" << endl;
65     c2.IsValid() == true ? cout << "c2 is right" << endl : cout << "c2 is wrong" << endl;
66     c3.IsValid() == true ? cout << "c3 is right" << endl : cout << "c3 is wrong" << endl;
67     c4.IsValid() == true ? cout << "c4 is right" << endl : cout << "c4 is wrong" << endl;
68     c5.IsValid() == true ? cout << "c5 is right" << endl : cout << "c5 is wrong" << endl;
69 
70     return 0;
71 }
复制代码

 

 

priority_queue

 

 

复制代码
 1 #include <iterator>
 2 #include <iostream>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     int a[] = {1,2,3,4,5,6,7,8,9,10};
11     priority_queue<int> pr(a,a+9);
12     pr.push(a[9]);
13 
14     cout << "enter queue :";
15     copy(a,a+10,ostream_iterator<int>(cout,"\t"));
16     cout << endl;
17 
18     cout << "leave queue :";
19     while(!pr.empty())
20     {
21         cout << pr.top() << "\t";
22         pr.pop();
23     }
24 }
复制代码

 

复制代码
 1 #include  <iostream>
 2 #include  <queue>
 3 #include  <string>
 4 
 5 using namespace std;
 6 
 7 class Student
 8 {
 9     int NO;
10     string name;
11     int chinese;
12     int math;
13 public:
14     Student(int NO,string name,int chinese,int math)
15     {
16         this->NO=NO,this->name=name,this->chinese=chinese,this->math=math;
17     }
18 
19     int GetNO() { return NO;}
20     string GetName() { return name;}
21     int GetChinese() const { return chinese; }
22     int GetMath() const { return math; }
23 
24     bool operator < (const Student &s) const
25     {
26         int sum1 = chinese + math;
27         int chinese2 = s.GetChinese();
28         int math2 = s.GetMath();
29         int sum2 = chinese2 + math2;
30     
31         if(sum1 < sum2) 
32             return true;
33         if((sum1 == sum2) && (chinese < chinese2))
34             return true;
35         return false;
36     }
37 };
38 
39 
40 int main()
41 {
42     Student s[] = { Student(1001,"zhang",70,80),
43             Student(1002,"li",80,70),
44             Student(1003,"wang",90,85),
45             Student(1004,"zhao",85,75) };
46 
47 
48     priority_queue<Student>pr(s,s+4);
49     cout << "Grade sort from high to low:" << endl;
50     cout << "ID\tname\tChinese\tMath" << endl;
51     while(!pr.empty())
52     {
53         Student  t = pr.top();
54         cout << t.GetNO() << "\t" << t.GetName() << "\t" << t.GetChinese() << "\t" << t.GetMath() << endl;
55         pr.pop();
56     }
57 
58     return 0;
59 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 template<class T,class Cont=vector<T>,class Pred=less<typename Cont::value_type> >
 6 class FixedPriority : public priority_queue<T,Cont,Pred>
 7 {
 8     int nLimit;
 9 public:
10     FixedPriority(int nLimit)
11     {
12         this -> nLimit = nLimit;
13     }
14 
15     void SetLimitSize(int nLimit)
16     {
17         this -> nLimit = nLimit;
18     }
19 
20     bool Push(T &t)
21     {
22         if(nLimit > this->size())
23         {
24             push(t);
25             return true;
26         }
27         return false;
28     }
29 };
30 
31 int main()
32 {
33     FixedPriority<int> fp(10);
34     for(int i = 0 ;i < 15 ;i ++)
35     {
36         if(!fp.Push(i))
37             cout << "Priority_queue has been full. the " << i << "th element can't insert into" << endl;
38     }
39 
40     return 0;
41 }
复制代码

 

bitset

 

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     bitset<5> s1;
10     cout << "initialize memory : " << s1.to_string() << endl;
11     cout << "bit container size: " << s1.size() << "\tset 1 counts:" << s1.count() << endl;
12 
13     s1.set(2,true);
14     cout << "After the bit2 set 1 : ";
15     cout << "The memory is :" << s1.to_string() << endl;
16 
17     s1[3] = 1;
18     cout << "After the bit3 set 1 : ";
19     cout << "The memory is : " << s1.to_string() << endl;
20 
21     s1.set();
22     cout << "After all the bits set 1 : ";
23     cout << "The memory is : " << s1.to_string() << endl;
24     
25     bitset<16> s2(65535);
26     cout << "create bitset via long: " << s2.to_string() << endl;
27     
28     bitset<5> s3("1111101",2,5);
29     cout << "create bitset via string : " << s3.to_string() << endl;
30 
31     return 0;
32 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     bitset<5> s1("01011");
11     bitset<5> s2("10010");
12     
13     cout << "s1:" << s1.to_string() << "\t";
14     cout << "s2:" << s2.to_string() << endl;
15 
16     s1 &= s2;
17     
18     cout << "s1 &= s2: " << s1.to_string() << endl;
19     
20     
21     bitset<5> s3("01011");
22     bitset<5> s4("10010");
23     bitset<5> s5 = s3 & s4;
24 
25     cout << "s3:" << s3.to_string() << "\t";
26     cout << "s4:" << s4.to_string() << endl;
27 
28     cout << "s5 = s3 & s4: " << s5.to_string() << endl;
29     cout << "org s3: " << s3.to_string() << endl;
30 
31     return 0;
32 }
复制代码

 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     bitset<8> b("11011101");
10     cout <<  "org container b: " << b.to_string() << endl;
11 
12     for(int i = 0; i < 4 ;i ++)
13         b.flip(i);
14     cout << "After flip low 4bits : " << b.to_string() << endl;
15 
16     return 0;
17 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <bitset>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 template<size_t N>
 9 class MyAttend
10 {
11     int month;
12     bitset<N> b;
13 public:
14     MyAttend(int month,string strAttend) : month(month),b(strAttend)
15     {
16         ;
17     }
18 
19     int GetMonth() { return month; }
20     int GetAttendDays() { return b.count(); }
21 };
22 
23 class Student
24 {
25     string name;
26     vector<MyAttend<31> >v;
27 public:
28     Student(string name)
29     {
30         this -> name = name;
31     }
32 
33     void Add(MyAttend<31> &m)
34     {
35         v.push_back(m);
36     }
37 
38     void ShowAttendDays()
39     {
40         cout << "name: " << name << endl;
41         cout << "month\texits" << endl;
42         
43         for(int i = 0 ;i < v.size();i ++)
44         {
45             MyAttend<31> &m = v.at(i);
46             int month = m.GetMonth();
47             int days = m.GetAttendDays();
48             cout << month << "\t" << days << endl;
49         }
50     }
51 };
52 
53 int main()
54 {
55     Student stud1("zhang");
56 
57     string s1 = "1111100111110011111001111100111";
58     string s2 = "1111100111110011111001111100";
59 
60     MyAttend<31> m1(1,s1);
61     MyAttend<31> m2(2,s2);
62 
63     stud1.Add(m1);
64     stud1.Add(m2);
65 
66     stud1.ShowAttendDays();
67 
68     return 0;
69 }
复制代码
复制代码
 1 #include <iostream>
 2 #include <fstream>
 3 #include <bitset>
 4 
 5 using namespace std;
 6 
 7 template<size_t N>
 8 class MyNum
 9 {
10 public:
11     bitset<N> b;
12 public:
13     void Set(int ary[],int nSize)
14     {
15         b.reset();
16         for(int i = 0 ;i < nSize ;i ++)
17             b.set(ary[i]-1,1);
18     }
19 };
20 
21 int main()
22 {
23     int a[6][10] = {{1,2,3,4,5,6,7,8,9,10},{1,3,4,5,6,7,8,9,10,12},
24     {2,4,6,8,10,13,15,18,19,20},{1,5,6,8,9,10,12,14,18,20},
25     {3,6,7,10,14,15,16,17,18,19},{1,6,8,9,10,12,15,17,18,19}};
26 
27     ofstream out("a.txt");
28 
29     MyNum<24> m;
30 
31     for(int i = 0 ; i < 6 ;i ++)
32     {
33         m.Set(a[i],0);
34         out.write((char *)&m.b,3);
35         cout << i << "\t";
36     }
37 
38     out.close();
39 
40     return 0;
41 
42 }
复制代码

 

set

 

map

 

 

复制代码
 1 #pragma warning(disable : 4786)
 2 #include <iostream>
 3 #include <sstream>
 4 #include <string>
 5 #include <vector>
 6 #include <map>
 7 
 8 using namespace std;
 9 
10 class CWord
11 {
12 private:
13     string mainword;
14     vector<string> vecword;
15 public:
16     CWord(string strLine)
17     {
18         istringstream in(strLine);
19         in >> mainword;
20         string mid = "";
21         while(!in.eof())
22         {
23             in >> mid;
24             vecword.push_back(mid);
25         }
26     }
27 
28     string GetMainWord() { return mainword; }
29     void Show()
30     {
31         cout << endl;
32         cout << "word is :" << "\t" << mainword << endl;
33         cout << "familier word is: " << "\t";
34         for(int i = 0 ;i < vecword.size(); i ++)
35             cout << vecword[i] << "\t";
36         cout << endl;
37     }
38 };
39 
40 class CWordManage
41 {
42     multimap<string,CWord> mymap;
43 public:
44     bool Add(string strLine)
45     {
46         CWord word(strLine);
47         pair<string,CWord>p(word.GetMainWord(),word);
48         mymap.insert(p);
49 
50         return true;
51     }
52 
53     void Show(string strFind)
54     {
55         multimap<string,CWord>::iterator itfind = mymap.find(strFind);
56         if(itfind != mymap.end())
57         {
58             CWord & obj = (*itfind).second;
59             obj.Show();
60         }
61         else
62         {
63             cout << strFind << "hasn't fimiliar word in dic." << endl;
64         }
65     }
66 
67     void Show()
68     {
69         multimap<string,CWord>::iterator te = mymap.begin();
70 
71         while(te != mymap.end())
72         {
73             CWord &obj = (*te).second;
74             obj.Show();
75             te ++;
76         }
77     }
78 };
79 
80 int  main()
81 {
82     string s[5] = {  string("one single unique"),string("correct true right"),
83         string("near close"),string("happy please"),string("strong powerful")};
84 
85     CWordManage manage;
86 
87     for(int i = 0 ; i <  5; i++)
88         manage.Add(s[i]);
89 
90     manage.Show();
91 
92     cout << "***************************************************" << endl;
93     manage.Show("near");
94     cout << "***************************************************" << endl;
95     manage.Show("good");
96 
97     return 0;
98 }
复制代码

 

复制代码
 1 #pragma warning(disable:4786)
 2 #include <iostream>
 3 #include <string>
 4 #include <set>
 5 
 6 using namespace std;
 7 
 8 class CEmployee
 9 {
10 private:
11     string name;
12     string departname;
13 public:
14     CEmployee(string name,string departname)
15     {
16         this -> name = name;
17         this -> departname = departname;
18     }
19 
20     bool operator < (const CEmployee &e) const
21     {
22         bool mark = (departname.compare(e.departname) < 0) ? true : false;
23 
24         if(departname.compare(e.departname) == 0)
25             mark = (name.compare(e.name) < 0) ? true : false;
26 
27         return mark;
28     }
29 
30     string GetName() { return name; }
31     string GetDepart() { return departname; }
32 };
33 
34 class CManage
35 {
36     multiset<CEmployee> myset;
37 public:
38     bool Add(CEmployee &e)
39     {
40         myset.insert(e);
41         return true;
42     }
43 
44     void Show()
45     {
46         multiset<CEmployee>::iterator te = myset.begin();
47 
48         while(te != myset.end())
49         {
50             CEmployee &obj = *te;
51             cout << obj.GetDepart() << "\t" << obj.GetName() << endl;
52             te ++;
53         }
54     }
55 };
56 
57 
58 int  main()
59 {
60     CEmployee e1("zhangdan","renli");
61     CEmployee e2("zhouqi","zhuangpei");
62     CEmployee e3("wangwu","zhizao");
63     CEmployee e4("zhaoliu","zhizao");
64     CEmployee e5("lisi","zhuangpei");
65     CEmployee e6("tianjiu","zhizao");
66 
67     CManage manage;
68     manage.Add(e1);
69     manage.Add(e2);
70     manage.Add(e3);
71     manage.Add(e4);
72     manage.Add(e5);
73     manage.Add(e6);
74 
75     manage.Show();
76 
77     return 0;
78 }
复制代码

 

 STL还有一些预迭代器:

1,插入迭代器

  back_insert_iterator(Cont &x)

  front_insert_iterator(Cont &x)

  insert_iterator(Cont &x,Cont::iterator it)

  back_insert_iterator<Cont>   back_inserter(Cont &x)

  front_insert_iterator<Cont>   frontinserter(Cont &x)

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <iterator>
 4 
 5 using namespace std;
 6 
 7 void display(list<int> &v)
 8 {
 9     for(list<int>::iterator it = v.begin() ; it != v.end() ; it ++)
10         cout << *it << "\t";
11     cout << endl;
12 }
13 
14 
15 int main()
16 {
17     list<int> v;
18 
19     back_insert_iterator<list<int> > backit(v);
20 
21     *backit ++ = 1;
22     *backit ++ = 2;
23 
24     display(v);
25 
26     *back_inserter(v) = 3;
27     *back_inserter(v) = 4;
28 
29     display(v);
30 
31     front_insert_iterator<list<int> > frontit(v);
32 
33     *frontit ++ = 5;
34     *frontit ++ = 6;
35 
36     display(v);
37 
38     *front_inserter(v) ++ = 7;
39     *front_inserter(v) ++ = 8;
40 
41     display(v);
42 
43     list<int>::iterator it = v.begin();
44     for(int i = 0 ;i < 3 ;i ++)
45     {
46         it ++;
47     }
48 
49     insert_iterator<list<int> >insertit(v,it);
50     *insertit ++ = 9;
51 
52     display(v);
53 
54     return 0;
55 }
复制代码

 

2,逆向迭代器

  reverse_iterator(Ranit x)

  reverse_bidirectional_iterator(Bidit x)

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <vector>
 4 #include <iterator>
 5 
 6 using namespace std;
 7 
 8 template<class reverse_iter>
 9 void reverse_display(reverse_iter first,reverse_iter last)
10 {
11     while(first != last)
12     {
13         cout << *first << "\t";
14         first ++;
15     }
16 
17     cout << endl;
18 }
19 
20 int main()
21 {
22     vector<int> v;
23     list<int> l;
24 
25     for(int i = 1 ;i <= 5; i ++)
26     {
27         v.push_back(i);
28         l.push_back(i+5);
29     }
30 
31     cout << "display vector reversely: " << endl;
32     reverse_iterator<vector<int>::iterator,int> first(v.end());
33     reverse_iterator<vector<int>::iterator,int> last(v.begin());
34     reverse_display(first,last);
35 
36     cout << "display list reversely: " << endl;
37     reverse_bidirectional_iterator<list<int>::iterator,int> first2(l.end());
38     reverse_bidirectional_iterator<list<int>::iterator,int> last2(l.begin());
39     reverse_display(first2,last2);
40 
41     return 0;
42 }
复制代码

 

3, 迭代器函数

  template<class InIt,class Dist>

  void advance(Init & it, Dist n);           it += n

 

  template<class Init,class Dist>

  ptrdiff_t distance(Init  first,Init last)            求距离

 

例子:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int a[] = {1,2,3,4,5,6};
10 
11     list<int> l(a,a+6);
12 
13     cout << "The element in List: ";
14     copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\t"));
15     cout << endl;
16 
17     list<int>::iterator mid = find(l.begin(),l.end(),3);
18 
19     cout << "Element 3's position : " << distance(l.begin(),mid) << endl;
20 
21     advance(mid,2);
22 
23     cout << "Element 3 's ahead 2 is : " << *mid << endl;
24 
25     return 0;
26 }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值