學習C++ primer 之路 - ( 第十六章 之 STL模板之vector)

一、定義vector模板

vector<type>name(num)  //num表示定義的初始長度 type表示類型

 是一個容器,必須引入頭文件 #include<vector>

vector是一個順序容器,它的內存地址是連續的。 

二、迭代器

什麼是迭代器?它是一個廣義指針,事實上,他可以是指針,也可以是一個對其執行類似指針的操作——如解引用(*)如)(operator*())和遞增(如operatolr++())——的對象,通過將指針廣義化爲迭代器,讓STL能夠成爲各種不同的容器類統一的接口。每個容器類都定義了合適的迭代器,該迭代器的類型是一個名爲iteratortypedef。

迭代器定義如下: 

需要頭文件#<include>iterator

vector<double>::itearator pd;  //定義一個daouble類型的vector容器迭代器pd

 例子:

vector<double>::iterator pd;
vector<double>scores={1,2,3};
pd = scores.begin(); //將scores容器的第一個元素的地址賦予迭代器
while(pd!=score.begin)
{
    cout << *pd << endl;     //打印容器裏的元素
    pd++; //循環地址增加指向下一個地址
}

迭代器的種類:

迭代器種類 簡要
iterator 前向遍歷 可讀可寫(從前往後遍歷)
const_iterator 前向遍歷,只讀
reverse_iterator 後向遍歷,可讀可寫(從後往前遍歷)
const_reverse_iterator 後向遍歷,只讀

關於begin end成員函數下面後有詳細介紹 ↓↓↓

 三、vector容器的常用操作函數(還有所有容器公用的函數)

1.size()

返回vector容器中所有元素個數(長度)。

2.swap()

用於將兩個相同類型的容器元素進行交換

例:

vector<int>v1 = {1,2,3};
vector<int>v2 = {4,5,6,7,9};
v1.swap(v2);  //交換必須是兩個類型相同的vector容器才能交換
for(int i = 0;i<v1.size();i++)
{
    cout << v1[i] <<" ";  // v1 = {4,5,6,7,9}
}
cout << endl;
for(int i = 0;i<v2.size();i++)
{
    cout << v2[i] <<" ";  //v2 = {1,2,3};
}
cout << endl;

3.begin()和end()

返回一個指向容器中第一個元素的迭代器和返回一個指向容器中最後一個元素 + 1(表示超過容器尾的)位置的迭代器

不知道end具體指向哪裏的請看圖:

例:

vector<int>l1 = {1,2,3,4,5,6,7,8,9,10};
vector<int>::iterator pt;
pt = l1.begin()
for(;pt!=l1.end();pt++)
{
    cout << *pt << " & "; //打印l1中的元素
}

4.push_back()

表示從數組最後一個元素後面添加一個元素。

例:

vector<int>l1 = {1,2,3,4,5,6,7,8,9,10};
l1.push_back(60);    //結果 l1 = {1,2,3,4,5,6,7,8,9,10,60};

5.erase()

刪除給定的容器的區間,這裏它接收兩個迭代器參數(這些參數定義了區間),第一個迭代器執行區間的起始處,第二個迭代位於區間中指出的後一個位置

例:

vector<int> pl= {1,2,3,4,5};
pl.erase(pl.begin()+1,pl.begin()+3); //pl = {1,4,5}'

6.insert()

接受三個迭代器參數,第一個是指定新元素插入的位置,第二個和第三個迭代器參數定義了被插入區間,該區間通常是另一個容器對象的一部分

例如 將下面矢量new_v中除了第一個元素外的所有元素插入到old_v矢量的第一個元素前面:

vector<int>old_v = {1,2,3};
vector<int>new_v = {4,5,6};
old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end());
//old_v = {1,5,6,3};

7.for_each() 注:需要引入頭文件<algorithm>

可以用於多種容器類,接受三個參數,前兩個是定義容器中區間的迭代器,最後是一個指向函數的指針(更普遍的說最後一個是一個函數對象),for_each函數將被指向的函數應用於容器區間中的各個元素,被指向的函數不能修改容器元素的值。完全可以用for_each()函數來代替循環

例:

#include<vector>
#include<algorithm>
#include<iostream>
using std::cout;
using std::endl;
void Show(int & p)
{
    cout << p << endl;
}
int main () 
{
    vector<int> mm(5) = {11,22,33,44,55};
    for_each(mm.begin(),mm.end(),Show);


    /*
        最後打印出 11,22,33,44,55
    */
    return 0;
}

如果學過JS的話有一個forEach接受一個回調函數差不多的

8.random_shuffle() 注:需要引入頭文件<algorithm>

接受兩個指定區間的迭代器參數,並隨機排列該區間中的元素;

9.sort() 注:需要引入頭文件<algorithm>

該函數也要要求容器支持隨機訪問。這個函數公有兩個版本。

第一個:

接受兩個定義區間的迭代器參數,並使用爲存儲在容器中的類型元素定義的<運算符對區間中的元素進行操作。

例:

vector<int>po = {55,33,198,36,884};
sort(po.begin(),po.end()); //結果 {33,36,55,198,884};

第二個:

接受兩個定義區間的迭代器參數,並且還接受一個用戶自定義的函數。

例如:

bool compear(int a, int b)
{
	if (a > b)
	{
		return true;	//a在b的後面
	}
	return false;
}
int main ()
{
    vector<double>d1 = { 60.0,5.69,66.9,48.4,0.58,9.5 };
	sort(d1.begin(), d1.end(), compear);	//比較容器中的元素大小,前兩個是比較區間,最後一個參數是一個函數指針,傳入一個自定義函數,可以自定義排序
}

四、基於範圍的for循環(C++11)

例如:

double prices[5] = {44.0,10.99,6.87,7.89,8.49};
for(double x: prices)
{
    cout << x << std::endl;
}

 這種for循環中,括號內的代碼聲明一個類型與容器存儲的內容相同的變量,然後指出了容器的名稱。然後循環體使用指定變量一次訪問容器的每個元素。

for_each(books.begin(),books.end(),Show);

可以將其替換爲下面基於範圍的for循環:

for(auto x : books) Show(x);

也可以用引用參數來修改容器內容:

for(auto & x : books) Show(x);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章