上次我們聊到了順序容器與關聯容器的概念,也簡要總結了stl中主要容器的分類,同時也對list具體的使用與實現進行了描述,這次我們關注vector
vector字面意思很好理解,向量!這樣我們可以直接得知它屬於一種順序容器,那麼意味著他在記憶體上的分布是連續的,那麼我們順理成章的可以想到其內部是用陣列來實現,在末尾增加或者刪除元素所需時間與元素數目無關,在中間或者開頭增加或者刪除元素所需時間是隨元素數目呈線性變化,(意味著資料量越大,速度越慢,這也是vector的弊端之一)
常用方法
//1.定義和初始化
vector
vec1; //預設初始化,vec1為空
vector
vec2(vec1); //使用vec1初始化vec2
vector
vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector
vec4(10); //10個值為0的元素
vector
vec5(10,4); //10個值為4的元素
//2.常用操作方法
vec1.push_back(100); //尾部新增元素
int size = vec1.size(); //元素個數
bool isempty = vec1.empty(); //判斷是否為空
cout
<0]vec1.insert(vec1.end(),5,3); //從vec1.back位置插入5個值為3的元素
vec1.pop_back(); //刪除末尾元素
vec1.erase(vec1.begin(),vec1.begin()+2);//刪除vec1[0]-vec1[2]之間的元素,不包括vec1[2]其他元素前移
cout
<<(vec1==vec2)?true:false; //判斷是否相等==、!=、>=、<=...
vector
::iterator iter = vec1.begin(); //獲取迭代器首位址
vector
::const_iterator c_iter = vec1.begin(); //獲取const型別迭代器
vec1.clear(); //清空元素
//3.遍歷
//下標法
int length = vec1.size();
for(int i=0;icout
vector
::iterator iter = vec1.begin();
for(;iter != vec1.end();iter++)
總結一下vector
1、佔據一塊連續的記憶體空間;
2、內部實現是通過管理了乙個指標,只是當記憶體空間不夠時,會重新分配一塊更大的記憶體空間,通常是將容量擴大一倍;
3、vector對尾部操作很方便,對頭部或者插入都需要o(n)的時間複雜度;
4.採用模板實現泛型類vector,為了支援大多數的編譯器,將實現檔案全部放在標頭檔案中,不採用分離編譯的方式
簡單實現(c++)
myvector.h
#pragma once
#include
#include
//void test_vector()
// else
// }
// print_vector(v1);
////
// //找到5的位置,在它前面插入乙個30
// vector::iterator pos1 = find(v1.begin(), v1.end(), 5);
// v1.insert(pos1, 30);
//// print_vector(v1);
//// //刪除30
// pos1 = find(v1.begin(), v1.end(), 30);
// v1.erase(pos1);
// print_vector(v1);
//}//
//void test_vector1()
////void print_vector(const vector& v)
// cout << endl;
//}//
template
class vector
~vector()
}//resize改變容器大小,且再建立物件
//第乙個引數容器新的大小,第二個引數是要插入的元素,如果省略掉預設構造
void resize(size_t n, const t& val = t())
size_t size = size();
if (n < size)
else}}
void reserve(size_t n)
void popback()
void pushback(const t& x)
*_finish = x;
++_finish;
}bool isempty()
iterator begin()
iterator end()
size_t size()
size_t capacity()
void expand(size_t n)
delete _start;
_start = tmp;
_finish = _start + size;
_endofstorage = _start + n;}}
t& operator(size_t index)
const t& operator (size_t index)const
t &operator=(const t& pos)
protected:
iterator _start;
iterator _finish;
iterator _endofstorage;
};void testvector()
cout
<< endl;
for (size_t i = 0; i < v.size(); ++i)
cout
<< endl;
int ret1 = v.isempty();
cout
<< ret1 << endl;
}
test.cpp
1
1、只實現了部分函式的功能,但是類似的可以定義其他的函式;
2、迭代器只是採用定義為指標的方式,這種方式比較簡單,但是不能實現迭代器完全的功能。不過迭代器的本質也是將這個指標封裝成乙個類。
使用STL的vector容器類
範例程式 include include include include include using namespace std int main char b size 定義vector物件 vectorvf a,a size vectorvc b,b size sizef vf.size siz...
c 中的STL的vector容器
c 中我相信大家經常要用到stl裡面的各種容器來存放自己的資料,既然我們用的這麼頻繁那麼就相應該有一些疑問?1.容器裡面什麼時候應該存指標?2.容器裡面什麼時候應該存物件?3.容器怎麼在遍歷的時候刪除某元素?4.容器應該怎麼釋放掉?一.分析一下stl裡面工作方式 對於內建型別 int float c...
教你使用STL容器之vector
c 語言本身提供了乙個序列式容器array,stl另外再提供vector list deque stack queue priority queue等序列式容器。vector的資料安排以及操作方式,與array是很相似的,唯一的不同點在於空間的運用的靈活性,array是靜態的,一旦配置了就不能再改變...