1. 程式人生 > 其它 >【原創】【未完待續】自制vector型別

【原創】【未完待續】自制vector型別

繼《自制string型別》以來的第二篇自制型別的文章。馬上要開學了,時間也不多了,爭取在今年寫完吧。

目錄
一,vector型別簡單介紹
1.簡介
1.1.STL
1.2.vector
2.vector有哪些函式?
二,泛型
1.什麼是泛型
2.泛型的實現
2.1.函式模板
2.2.類模板

一,vector型別簡單介紹

1.簡介

1.1.STL

STL是一個C++自帶的一個數據結構的類,包括棧,佇列,字串等功能。這些資料結構統稱為容器(containers)。

1.2.vector

vector(向量),是一種經常被使用的容器。它可以看做是一種動態大小的陣列,並且可以存放任何型別的資料(即泛型)。
這裡給大家一個使用的例子:

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> v;
	for(int i=0;i<10;i++){
		v.push_back(i);
		cout<<v[i]<<endl;
	}
	return 0;
} 

關於更加具體的內容,筆者參考了一個網頁:網頁連結

2.vector有哪些函式?

(來源:網頁連結

1.建構函式
vector()//建立一個空vector
vector(int nSize)//建立一個vector,元素個數為nSize
vector(int nSize,const t& t)//建立一個vector,元素個數為nSize,且值均為t
vector(const vector&)//複製建構函式
vector(begin,end)//複製[begin,end)區間內另一個數組的元素到vector中
2.增加函式
void push_back(const T& x)//向量尾部增加一個元素X
iterator insert(iterator it,const T& x)//向量中迭代器指向元素前增加一個元素x
iterator insert(iterator it,int n,const T& x)//向量中迭代器指向元素前增加n個相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last)//向量中迭代器指向元素前插入另一個相同型別向量的[first,last)間的資料
3.刪除函式
iterator erase(iterator it)//刪除向量中迭代器指向元素
iterator erase(iterator first,iterator last)//刪除向量中[first,last)中元素
void pop_back()//刪除向量中最後一個元素
void clear()//清空向量中所有元素
4.遍歷函式
reference at(int pos)//返回pos位置元素的引用
reference front()//返回首元素的引用
reference back()//返回尾元素的引用
iterator begin()//返回向量頭指標,指向第一個元素
iterator end()//返回向量尾指標,指向向量最後一個元素的下一個位置
reverse_iterator rbegin()//反向迭代器,指向最後一個元素
reverse_iterator rend()//反向迭代器,指向第一個元素之前的位置
5.判斷函式
bool empty() const//判斷向量是否為空,若為空,則向量中無元素
6.大小函式
int size() const//返回向量中元素的個數
int capacity() const//返回當前向量所能容納的最大元素值
int max_size() const//返回最大可允許的vector元素數量值
7.其他函式
void swap(vector&)//交換兩個同類型向量的資料
void assign(int n,const T& x)//設定向量中前n個元素的值為x
void assign(const_iterator first,const_iterator last)//向量中[first,last)中元素設定成當前向量元素

二,泛型

1.什麼是泛型?

最簡單的例子:

#include<iostream>
#include<vector>
using namespace std;
int main(){
	int a=5,b=10;cout<<max(a,b);
	float c=3.14,d=9.99;cout<<max(c,d);
	char e='x',f='*';cout<<max(e,f);
} 

這裡,max函式即可以處理int,又可以處理float,char型別的最大值。這就是泛型。max函式無論針對哪一個型別,操作都是相同的。因此,我們使用通用型別,讓函式不關注型別只關注具體的操作。
有人會問,其實使用函式過載不就能完成了嗎?(不瞭解函式過載是什麼的,請看我前面寫過的《自制string型別》,裡面有說明)但是,函式過載要重複寫好幾次,不方便。

2.泛型的實現

2.1.函式模板

在寫真正的vector泛型之前,我們首先使用MAX函式練習一下,藉此看看如何寫泛型。

#include<iostream>
#include<vector>
using namespace std;
template<typename T>
T MAX(T a,T b){
	if(a>b)return a;
	else return b;
}
int main(){
	int a=5,b=10;cout<<MAX(a,b);
	float c=3.14,d=9.99;cout<<MAX(c,d);
	char e='x',f='*';cout<<MAX(e,f);
}

template表示定義一個叫做T的型別,這個型別是一個通用型別。這個語句告訴編譯器,要開始泛型程式設計,其中T是要使用的泛型型別。
執行的時候,編譯器會自動根據引數的型別,把T轉換為int,float等型別,進行計算。
注意,泛型的函式不會進行自動型別轉換,例如cout<<MAX('a',100);這個語句,如果使用的是泛型型別,會編譯錯誤,但是使用普通型別不會報錯,因為普通型別的函式會進行自動型別轉換。

2.2.類模板

寫法和函式模板非常類似。

template<typename T>
class Vector{
	T *numbers;
	
};

在宣告Vector型別的時候,需要注意:宣告不能寫成:

Vector v;

而必須寫成:

Vector<int>v;

這樣才可以告訴編譯器需要定義的型別。