一、vector的介紹
vector是表示可變大小陣列的序列容器。
就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素
進行訪問,和陣列一樣高效。但是又不像陣列,它的大小是可以動態改變的,而且它的大小會被容器自
動處理。
本質講,vector使用動態分配陣列來儲存它的元素。當新元素插入時候,這個陣列需要被重新分配大小
為了增加儲存空間。其做法是,分配乙個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是
乙個相對代價高的任務,因為每當乙個新的元素加入到容器的時候,vector並不會每次都重新分配大
小。vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為儲存空間比實際需要的存
儲空間更大。不同的庫採用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是
對數增長的間隔大小,以至於在末尾插入乙個元素的時候是在常數時間的複雜度完成的。
因此,vector占用了更多的儲存空間,為了獲得管理儲存空間的能力,並且以一種有效的方式動態增
長。與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在
末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和
forward_lists統一的迭代器和引用更好。
二、vector的介面
|介面名 | 介面說明 |
|–|--|
| begin | 獲取第乙個資料位置 |
| end | 獲取最後乙個元素的下乙個位置 |
|rbegin | 獲取最後一元素的下乙個位置 |
|rend | 獲取第乙個元素的位置 |
| size |獲取資料個數 |
|capacity | 獲取容量大小 |
| empty |判斷是否為空 |
| resize |改變vector的size |
|reserve |改變vector的capacity |
|push_back | 尾插 |
|pop_back |尾刪 |
|find |查詢 |
| insert |在position之前插入val |
| erase |刪除position位置的資料 |
| swap | 交換兩個vector的資料空間 |
| operator | 像陣列一樣訪問 |
vector迭代器失效問題:刪除元素會導致此處的空間不屬於vector,但你訪問這個位置的元素就會導致非法訪問、在插入元素的時候有可能會導致增容,但是vector的增容原理是在其他地方開闢乙個更大的空間再將原來vector的元素重新賦值過去、這樣就會導致迭代器訪問的是原來的空間、就會導致非法訪問。
eg:
#include
#include
#include
using
namespace std;
intmain()
; vector<
int>
v(a, a +
sizeof
(a)/
sizeof
(int))
;// 使用find查詢3所在位置的iterator
vector<
int>
::iterator pos =
find
(v.begin()
, v.
end(),
3);// 刪除pos位置的資料,導致pos迭代器失效。
v.erase
(pos)
; cout <<
*pos << endl;
// 此處會導致非法訪問
// 在pos位置插入資料,導致pos迭代器失效。
// insert會導致迭代器失效,是因為insert可
// 能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了。
pos =
find
(v.begin()
, v.
end(),
3); v.
insert
(pos,30)
; cout <<
*pos << endl;
// 此處會導致非法訪問
return0;
}
三、vector的模擬實現
using
namespace std;
#include
// 注意這裡namespace大家下去就不要取名為bit了,否則出去容易翻車。^^
namespace bit
iterator end()
const_iterator cbegin()
const
const_iterator cend()
const
// construct and destroy
vector()
:_start
(nullptr),
_finish
(nullptr),
_endofstorage
(nullptr
)vector
(int n,
const t& value =t(
)):_start
(nullptr),
_finish
(nullptr
)using
namespace std;
#include
// 注意這裡namespace大家下去就不要取名為bit了,否則出去容易翻車。^^
namespace bit
iterator end()
const_iterator cbegin()
const
const_iterator cend()
const
// construct and destroy
vector()
:_start
(nullptr),
_finish
(nullptr),
_endofstorage
(nullptr
)vector
(int n,
const t& value =t(
)):_start
(nullptr),
_finish
(nullptr)}
vector
(const vector
& v)
位元科技
:_start
(nullptr),
_finish
(nullptr),
_endofstorage
(nullptr
) _finish = _start + v.
size()
; _endofstorage = _start + v.
capacity()
;}vector
&operator
=(vector v)
~vector()
// capacity
size_t size()
const
size_t capacity()
const
void
reserve
(size_t n)
_start = tmp;
_finish = _start + size;
_endofstorage = _start + n;}}
void
resize
(size_t n,
const t& value =t(
))// 2.空間不夠則增容
if(n >
capacity()
)reserve
(n);
// 3.將size擴大到n
iterator it = _finish;
iterator _finish = _start + n;
while
(it != _finish)
}///access///
t&operator
(size_t pos)
const t&
operator
(size_t pos)
const
///modify/
void
push_back
(const t& x)
void
pop_back()
void
swap
(vector
& v)
iterator insert
(iterator pos,
const t& x)
iterator end = _finish -1;
while
(end >= pos)
*pos = x;
++_finish;
return pos;
}// 返回刪除資料的下乙個資料
// 方便解決:一邊遍歷一邊刪除的迭代器失效問題
iterator erase
(iterator pos)
--_finish;
return pos;
}private
: iterator _start;
// 指向資料塊的開始
iterator _finish;
// 指向有效資料的尾
iterator _endofstorage;
// 指向儲存容量的尾
};
C Boost 初步了解
boost是由c 標準委員會成員發起 眾多c 業界高人參與設計並實現的乙個涉及面廣 質量高且業已廣泛使用的c 標準後備庫,其中 tr1已經被納入c 0x標準庫。不論從風格和內容組織上講,都可以認為boost專案是c 標準庫的延伸。截止到boost 1.43版本,boost專案擁有大約100個用途廣泛...
jquery 初步了解
js 建立函式有以下三種方法 1 函式關鍵字 function foo x 2 匿名函式 var func function x 3 建構函式 var func new function x alert x 建構函式每次執行時都解析函式主題 頻繁呼叫建構函式效率很低 並且建構函式不能遞迴使用 關鍵字...
Tomcat初步了解
http協議預設的埠號為80,如果伺服器的埠號為80,則url中的埠號可以省略,否則必須使用冒號加埠號指明埠。tomcat的埠號可在g soft apache tomcat 7.0.59 conf server.xml檔案中配置 訪問本機tomcat伺服器的方式 2.3.http 本機ip 8080...