1. 程式人生 > >走進C++程式世界----STL標準庫

走進C++程式世界----STL標準庫

/*
 *operator_fun.cpp
 *cDate : 2013-11-09
 *Author: sjin
 *Mail:[email protected]
 */

//簡單的demo程式,認識向量
void demo();
void init_vector();
void demo2();

/*
 *vector.cpp
 *cDate : 2014-04-09
 *Author: sjin
 *Mail:[email protected]
 */
#include <iostream>
#include <vector>
#include <algorithm>
#include "vector.h"
using namespace std;

//STL容器簡單介紹
//順序容器vector
void demo()
{
	int i;
    /*一個動態的整型陣列*/
    vector <int> vecIntArray;

    vecIntArray.push_back(1988);
    vecIntArray.push_back(2);
    vecIntArray.push_back(20);
    vecIntArray.push_back(2013);
    vecIntArray.push_back(11);
    vecIntArray.push_back(2);

    cout << "動態陣列的內容是:" << endl;

    vector <int>::iterator iArrayWalker = vecIntArray.begin();

    while ( iArrayWalker != vecIntArray.end() ){
        cout << *iArrayWalker << endl;
        ++ iArrayWalker;
    }

    //查詢2013是否存在陣列中,並列印在陣列中的位置
    vector <int>::iterator iElement = find(vecIntArray.begin(),vecIntArray.end(),2013);

    if(iElement != vecIntArray.end()){
        int nPosition = distance(vecIntArray.begin(),iElement);
        cout << "Value " << *iElement;
        cout << "發現他在陣列中的位置是:"<< nPosition << endl;
    }
}

/*1、預設建構函式,構造一個初始長度為0的空向量,如:vector<int> v1;
 *2、帶有單個整形引數的建構函式,此引數描述了向量的初始大小。這個建構函式還有一個可選的引數,這是一個型別為T的例項,描述了
 *各個向量種各成員的初始值;如:vector<int> v2(n,0); 如果預先定義了:n,他的成員值都被初始化為0;
 * 3、複製建構函式,構造一個新的向量,作為已存在的向量的完全複製,如:vector<int> v3(v2);
 * 4、帶兩個常量引數的建構函式,產生初始值為一個區間的向量。區間由一個半開區間[first,last) 來指定。如:vector<int> v4     
 *(first,last)
 */

void init_vector()
{
	int ar[10] = {1,2,3,4,5,6,7,8,9,0};
	char *str = "Hello World!";

	vector <int> vec1(ar,ar+10);
	vector <char> vec2(str,str+strlen(str));

	//列印vec1 和vec2 
	//const_iterator :是迭代器
	vector <int>::const_iterator p;

	cout <<"****************start vec1************************" <<endl;
	for(p = vec1.begin(); p != vec1.end(); ++p){
		cout << *p <<" ";
	}
	cout << "\n*********************end vec1*********************" << endl;

	vector <char>::const_iterator p1;
	cout <<"\n\n****************start vec2************************" <<endl;
	for(p1 = vec2.begin(); p1 != vec2.end(); ++p1){
		cout << *p1 <<" ";
	}
	cout << "\n*********************end vec2*********************" << endl;

}

/*測試容器的功能,瞭解基本函式的使用方法
 *begin(),end(),push_back(),assign(),front(),back(),erase(),empty(),at(),size()。
 */

//自定義型別
typedef vector <int> INTVECTOR;
void demo2()
{
	//vec1物件初始化為空
	INTVECTOR vec1;

	//vec2 物件最初由10個值為6的元素
	INTVECTOR vec2(10,6);

	//vec3 物件最初由3個值為6的元素,拷貝構造

	INTVECTOR vec3(vec2.begin(),vec2.begin()+3);

	//宣告一個名為i 的雙向迭代器

	INTVECTOR::iterator i;

	cout <<"\n****************start vec1************************" <<endl;
	for(i = vec1.begin(); i != vec1.end(); ++i){
		cout << *i <<" ";
	}
	cout << "\n*********************end vec1*********************" << endl;

	cout <<"\n****************start vec2************************" <<endl;
	for(i = vec2.begin(); i != vec2.end(); ++i){
		cout << *i <<" ";
	}
	cout << "\n*********************end vec2*********************" << endl;

	cout <<"\n****************start vec3************************" <<endl;
	for(i = vec3.begin(); i != vec3.end(); ++i){
		cout << *i <<" ";
	}
	cout << "\n*********************end vec3*********************" << endl;

	cout <<"測試新增和插入成員函式,vector 不支援從前插入"<<endl;
	vec1.push_back(2);
	vec1.push_back(4);

	//在vec1 第一個位置上插入5
	vec1.insert(vec1.begin()+1,5);

	//在vec1第一位置開始插入vec3的所有成員
	vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());

	cout <<"\n********push_back and insert start vec1**********" <<endl;
	for(i = vec1.begin(); i != vec1.end(); ++i){
		cout << *i <<" ";
	}
	cout << "\n*********push_back and insert end vec1*********" << endl;

    //測試賦值成員函式
	//重新給vec2賦值,8個成員都被賦值為1;
	vec2.assign(8,1);
	cout <<"\n********vec2.assign(8,1); start vec2************" <<endl;
	for(i = vec2.begin(); i != vec2.end(); ++i){
		cout << *i <<" ";
	}
	cout << "\n*********vec2.assign(8,1); end vec2************" << endl;

	//測試引用類函式
    cout<<"vec1第零個成員 vec1.front()="<<vec1.front()<<endl;
    cout<<"vec1的最後一個成員 vec1.back()="<<vec1.back()<<endl;
    cout<<"vec1的第五個成員 vec1.at(4)="<<vec1.at(4)<<endl;
    cout<<"vec1的第五個成員 vec1[4]="<<vec1[4]<<endl;
    //測試移出和刪除
    vec1.pop_back();//將最後一個成員移出vec1
    vec1.erase(vec1.begin()+1,vec1.end()-2);//刪除成員
    cout<<"vec1.pop_back() and vec1.erase():" <<endl;
    for (i =vec1.begin(); i !=vec1.end(); ++i){
        cout << *i << " ";
	}
    cout << endl;
    //顯示序列的狀態資訊
    cout<<"vec1.size(): "<<vec1.size()<<endl;//列印成員個數
    cout<<"vec1.empty(): "<<vec1.empty()<<endl;//清空
}

/*
 *operator_fun.cpp
 *cDate : 2013-11-09
 *Author: sjin
 *Mail:[email protected]
 */
#include <iostream>
#include <vector>
#include <algorithm>
#include "vector.h"

using namespace std;

//STL容器簡單介紹
int main()
{
	//demo();
	//init_vector();
	demo2();
    return 0;

}

push_back()是將資料放入vector(向量)或

deque(雙端佇列)的標準函式。Insert()是一個與之類似的函式,然而它在所有容器中都可以使用,但是用法更加複雜。end()實際上是取末尾加一,以便讓迴圈正確執行--它返回的指標指向最靠近陣列界限的資料。