C/C++學習筆記 vector 和map基本操作總結


vector簡介

       vector是STL中最常見的容器,它是一種順序容器,支持隨機訪問。vector是一塊連續分配的內存,從數據安排的角度來講,和數組極其相似,不同的地方就是:數組是靜態分配空間,一旦分配了空間的大小,就不可再改變了;而vector是動態分配空間,隨着元素的不斷插入,它會按照自身的一套機制不斷擴充自身的容量。

        vector的擴充機制:按照容器現在容量的一倍進行增長。vector容器分配的是一塊連續的內存空間,每次容器的增長,並不是在原有連續的內存空間后再進行簡單的疊加,而是重新申請一塊更大的新內存,並把現有容器中的元素逐個復制過去,然后銷毀舊的內存。這時原有指向舊內存空間的迭代器已經失效,所以當操作容器時,迭代器要及時更新。

vector的數據結構

        vector數據結構,采用的是連續的線性空間,屬於線性存儲。他采用3個迭代器_First、_Last、_End來指向分配來的線性空間的不同范圍,下面是聲明3個迭代器變量的源代碼。

template<class _Ty, class _A= allocator< _Ty> > 
class vector{ 
    ... 
    protected: 
    iterator _First, _Last, _End; 
};

vector對象的操作

vector標准庫提供了許多類似於string對象的操作,如下所示是一部分:

操作調用方式

操作說明

v.empty()

判斷v是否為空

v.size()

返回v中元素的個數

v.push_back(t)

向v的末尾添加一個元素

V[n]

返回v中位置為n的元素

V1 = v2

把v1中元素替換為v2中元素副本

V1==v2

判斷是否相等

!=, <, <=, >, >=

直接用於vector對象的相互比較

 

1.push_back   在數組的最后添加一個數據
2.pop_back    去掉數組的最后一個數據 
3.at                得到編號位置的數據
4.begin           得到數組頭的指針
5.end             得到數組的最后一個單元+1的指針
6.front        得到數組頭的引用
7.back            得到數組的最后一個單元的引用
8.max_size     得到vector最大可以是多大
9.capacity       當前vector分配的大小
10.size           當前使用數據的大小
11.resize         改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
12.reserve      改變當前vecotr所分配空間的大小
13.erase         刪除指針指向的數據項
14.clear          清空當前的vector
15.rbegin        將vector反轉后的開始指針返回(其實就是原來的end-1)
16.rend          將vector反轉構的結束指針返回(其實就是原來的begin-1)
17.empty        判斷vector是否為空
18.swap         與另一個vector交換數據


注,以下是一些需要注意的地方

Ø vector和string一樣,長度、下標等類型是size_type,但是vector獲取size_type時,需要指定類型,如vector<int>::size_type這樣的方式

Ø vector的下標操作,例如v[i],只能用於操作已經存在的元素,可以進行覆蓋、獲取等,但是不能通過v[i++]這種方式來給一個vector容器添加元素,該功能需要用push_back操作完成,下標不具備該功能

Ø C++程序員習慣優先使用!=而不是<來編寫循環判斷條件

 

 

map對象的定義和初始化

 

map是鍵-值對的組合,有以下的一些定義的方法:

 

  • map<k, v> m;
  • map<k, v> m(m2);
  • map<k, v> m(b, e);

 

上述第一種方法定義了一個名為m的空的map對象;第二種方法創建了m2的副本m;第三種方法創建了map對象m,並且存儲迭代器b和e范圍內的所有元素的副本。

 

map的value_type是存儲元素的鍵以及值的pair類型,鍵為const。

 

3、map對象的一些基本操作

 

3.1、map中元素的插入

 

在map中元素有兩種插入方法:

 

  • 使用下標
  • 使用insert函數

 

在map中使用下標訪問不存在的元素將導致在map容器中添加一個新的元素。

 

insert函數的插入方法主要有如下:

 

  • m.insert(e)
  • m.insert(beg, end)
  • m.insert(iter, e)

 

上述的e一個value_type類型的值。beg和end標記的是迭代器的開始和結束。

 

 

 

兩種插入方法如下面的例子所示:

#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 10; i ++){ mp[i] = i; } for (int i = 10; i < 20; i++){ mp.insert(make_pair(i, i)); } map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d-->%d\n", it->first, it->second); } return 0; }

map中元素的查找和讀取

注意:上述采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。

因此,若只是查找該元素是否存在,可以使用函數count(k),該函數返回的是k出現的次數;若是想取得key對應的值,可以使用函數find(k),該函數返回的是指向該元素的迭代器。

 

上述的兩個函數的使用如下所示:

#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 20; i++){ mp.insert(make_pair(i, i)); } if (mp.count(0)){ printf("yes!\n"); }else{ printf("no!\n"); } map<int, int>::iterator it_find; it_find = mp.find(0); if (it_find != mp.end()){ it_find->second = 20; }else{ printf("no!\n"); } map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d->%d\n", it->first, it->second); } return 0; }



從map中刪除元素

從map中刪除元素的函數是erase(),該函數有如下的三種形式:

  • m.erase(k)
  • m.erase(p)
  • m.erase(b, e)

第一種方法刪除的是m中鍵為k的元素,返回的是刪除的元素的個數;第二種方法刪除的是迭代器p指向的元素,返回的是void;第三種方法刪除的是迭代器b和迭代器e范圍內的元素,返回void。

如下所示:

#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 20; i++){ mp.insert(make_pair(i, i)); } mp.erase(0); mp.erase(mp.begin()); map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d->%d\n", it->first, it->second); } return 0; }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM