STL案例程式碼

程式設計-浪子發表於2015-04-28

//1.指標迭代器

#include <iostream>

#include <algorithm>

using namespace std;

 

#define SIZE 100

int iarray[SIZE];

 

int main()

{

iarray[20] = 50;

int* ip = find(iarray, iarray + SIZE, 50);

if (ip == iarray + SIZE)//如果指標指向陣列的尾部,就表示沒有找到

cout << "50 not found in array" << endl;

else

cout << *ip << " found in array" << endl;

 

system("pause");

return 0;

}

 

===========================================

//2.容器迭代器1

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

 

int main()

{

vector<int> intVector(100);

intVector[20] = 50;

vector<int>::iterator intIter = find(intVector.begin(), intVector.end(), 50);

if (intIter != intVector.end())

cout << "Vector contains value" << *intIter << endl;

else

cout << "Vector does not contain 50" << endl;

 

system("pause");

return 0;

}

 

================================================

//3.輸出迭代器

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

 

int main()

{

double darray[10] = { 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9 };

vector<double> vdouble(10);

 

vector<double>::iterator outputInterator = vdouble.begin();//定義容器迭代器,

copy(darray, darray + 10, outputInterator);

while (outputInterator != vdouble.end())

{

cout << *outputInterator << endl;

outputInterator++;

}

system("pause");

return 0;

}

 

提示:小夥伴們不要驚訝,這個1.0輸出後變成了1,這在DEVVS2013下輸出都是一樣的。

=========================================================

//4.流迭代器

#include <iostream>

#include <algorithm>

#include <vector>

#include <stdlib.h>

#include <time.h>

#include <iterator>

using namespace std;

 

void Display(vector<int>& v, const char* s)

{

cout << endl << s << endl;

copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\t"));//使用流迭代器,使用“\t”隔開

cout << endl;

}

 

int main()

{

srand(time(NULL));// 用時間初始化隨機發生器

vector<int> collection(10);

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

collection[i] = rand() % 1000;  // 產生的隨機數用1000 模運算

Display(collection, "Before sorting");//排序前輸出

sort(collection.begin(), collection.end());//對容器進行排序

Display(collection, "After sorting");//排序後輸出

system("pause");

return 0;

}

 

===========================================================

//5.插入代器

#include <iostream>

#include <algorithm>

#include <list>

#include <iterator>

using namespace std;

 

void Display(list<int>& a, const char* s)

{

cout << s << endl;

copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));

cout << endl;

}

 

int main()

{

int iArray[5] = { 1, 2, 3, 4, 5 };

list<int> iList;

//使用copy函式把陣列中值複製到STL容器,複製的時候利用前端插入,插入後,再在前面插入

// 若插入 1,再插入2,就變成了2,1

copy(iArray, iArray + 5, front_inserter(iList));

Display(iList, "Before find and copy ");

 

// 定義list容器迭代器,找到3的位置初始化迭代器,當前list容器的迭代器是(5,4,3,2,1)

list<int>::iterator p = find(iList.begin(), iList.end(), 3);

 

// 將陣列的前兩個元素插入到容器,插入位置為之前找到3的位置之前

copy(iArray, iArray + 2, inserter(iList, p));

Display(iList, "After find and copy");

 

system("pause");

return 0;

}

 

=======================================================

// 6. 函式和斷言

#include <iostream>

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <vector>

#include <algorithm>

using namespace std;

 

#define VSIZE 10

vector<long> v(VSIZE);

 

void initialize(long &ri);

void show(const long &ri);

bool isMinus(const long &ri);

 

int main()

{

srand(time(NULL));// 初始化隨機發生器種子

 

for_each(v.begin(), v.end(), initialize); //遍歷容器,呼叫普通函式賦值操作

cout << "Vector of signal long itergers" << endl;

for_each(v.begin(), v.end(), show); // 編譯容器,並顯示

cout << endl;

 

int count = 0;

vector<long>::iterator p;

// 呼叫斷言函式,如果容器中存在小於0的數,則返回第一個小於0 的迭代器

= find_if(v.begin(), v.end(), isMinus);

//cout << *p << endl;

// 統計小於0 的數的個數

while (!= v.end())

{

count++;

= find_if(+ 1, v.end(), isMinus);

}

cout << "Number of values:" << VSIZE << endl;

cout << "Negative valuses:" << count << endl;

 

system("pause");

return 0;

}

 

// 利用隨機數獲得值

void initialize(long &ri)

{

ri = (rand() - (RAND_MAX / 2));

}

 

// 顯示

void show(const long &ri)

{

cout << ri << " ";

}

 

// 判斷小於0的數,返回為真

bool isMinus(const long &ri)

{

return (ri < 0);

}

 

==========================================================

// 7. 函式物件

#include <iostream>

#include <numeric>

#include <vector>

#include <functional>

 

using namespace std;

 

#define MAX 10

vector<long> v(MAX);

 

int main()

{

//初始化容器容器中的元素

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

v[i] = i + 1;

// accumulate函式對容器內元素求和,標頭檔案numeric

long sum = accumulate(v.begin(), v.end(), 0);

cout << "Sum of values ==" << sum << endl;

 

//  函式模板acumulate利用multiplies仿函式(標頭檔案functional)對容器內元素進行連續相乘操作

long product = accumulate(v.begin(), v.end(),1, multiplies<long>());

cout << "Product of values ==" << product << endl;

 

system("pause");

return 0;

}

 

===================================================

// 8.發生器函式物件

#include <iostream>

#include <stdlib.h>

#include <time.h>

#include <algorithm>

#include <functional>

#include <vector>

#include<iterator>

using namespace std;

 

void Display(vector<int>& vr, const char* s);

unsigned int RandInt(const unsigned int n);

 

int main()

{

int iarray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

vector<int> v(iarray, iarray + 10);

 

srand(time(NULL));

Display(v, "Before shuffle:");

 

//Converts a unary function pointer into an adaptable unary function.

pointer_to_unary_function<unsigned int, unsigned int> ptr_RandInt =

ptr_fun(RandInt);

//對一個元素序列進行重新排序(隨機的),包含在標頭檔案 algorithm.h中

random_shuffle(v.begin(), v.end(), ptr_RandInt);

Display(v,"After shuffle:");

system("pause");

return 0;

}

 

/// 顯示

void Display(vector<int>& vr, const char* s)

{

cout << endl << s << endl;

copy(vr.begin(), vr.end(), ostream_iterator<int>(cout, " "));

cout << endl;

}

 

//返回隨機值

unsigned int RandInt(const unsigned int n)

{

return rand() % n;

}

 

=============================================

//9. 發生器函式物件

#include <iostream>

#include <algorithm>

#include <vector>

#include <iterator>

#include <functional>

using namespace std;

 

/*

FiboRand模板函式物件類,繼承自unary_function<Arg,Arg>

該類定義了兩個成員函式,一個是建構函式,另一是operator()()函式,

該操作符允許random_shuffle()演算法像一個函式一樣“呼叫"一個FiboRand物件。

*/

template <typename Arg>

class FiboRand :public unary_function<Arg, Arg>

{

int i, j;

Arg sequence[18];

public:

FiboRand();

Arg operator()(const Arg& arg);

};

 

 

template<typename Arg>

FiboRand<Arg>::FiboRand()

{

sequence[17] = 1;

sequence[16] = 2;

for (int n = 15; n >= 0; n--)

sequence[n] = sequence[+ 1] + sequence[+ 2];

i = 17;

j = 5;

/*

for (i = 0; i < 18; ++i)

cout << sequence[i] << " ";

cout << endl;

*/

}

 

template<typename Arg>

Arg FiboRand<Arg>::operator()(const Arg& arg)

{

Arg k = sequence[i] + sequence[j];

sequence[i] = k;

i--;

j--;

if (i == 0) i = 17;

if (j == 0) j = 17;

return k%arg;

}

 

void Display(vector<int>& vr, const char* s)

{

cout << endl << s << endl;

copy(vr.begin(), vr.end(), ostream_iterator<int>(cout, " "));

cout << endl;

}

 

 

int main()

{

int iarray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

vector<int> v(iarray, iarray + 10);

 

FiboRand<int> fibogen; //construct generator object

cout << "Fibonacci random number generator" << endl;

cout << "using random_shuffle and a  function object" << endl;

Display(v, "Before shuffle:");

random_shuffle(v.begin(), v.end(), fibogen);

Display(v, "After shuffle:");

 

system("pause");

return 0;

}

 

===============================================

//10.繫結器函式物件

 

#include <iostream>

#include <algorithm>

#include <functional>

#include <list>

using namespace std;

 

/*

bind1st() 建立一個函式物件,函式物件將值V作為第一個引數A

bind2nd() 建立一個函式物件,函式物件將值V作為第二個引數B

*/

 

int main()

{

int iarray[10] = { 1, 2, 11, 4, 34, 6, 7, 8, 9, 10 };

list<int> aList(iarray, iarray + 10);

 

int k = 0;

/*

 

typename iterator_traits<_InIt>::difference_type

count_if(_InIt _First, _InIt _Last, _Pr _Pred)

{// count elements satisfying _Pred

_DEBUG_RANGE(_First, _Last);

_DEBUG_POINTER(_Pred);

return (_Count_if(_Unchecked(_First), _Unchecked(_Last), _Pred));

}

*/

// count_if() 計算滿足特定條件的元素的數目

= count_if(aList.begin(), aList.end(), bind1st(greater<int>(), 8));

cout << "Number elements < 8 ==" << k << endl;

system("pause");

return 0;

}

 

==============================================

// 11.混合迭代器函式

#include <iostream>

#include <list>

#include <iterator>

using namespace std;

 

/*

advance()   按指定的數目增減迭代器

distance()  返回到達一個迭代器所需(遞增)操作的數目

*/

 

void Display(list<int>& v, const char* s)

{

cout << endl;

cout << s << endl;

copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

cout << endl;

}

 

int main()

{

int iArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

list<int> iList;

list<int>::iterator p = iList.begin(); //定義迭代器並指向容器開始

copy(iArray, iArray + 10, inserter(iList, p));//從p開始插入

//copy(iArray, iArray + 10, front_inserter(iList));//前端插入

Display(iList, "Before");

= find(iList.begin(), iList.end(), 2);

cout << "before:p==" << *<< endl;

advance(p, 2);//p+=2

cout << "after:p==" << *<< endl;

 

int k = 0;

= iList.begin();

= distance(p, iList.end());//等價於iList.end()-p,

cout << "k==" << k << endl;

system("pause");

return 0;

}

 


除錯平臺: VS2013

參考自《三十分鐘掌握STL》


相關文章