1.vector容器介紹
向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類(lèi)型容器一樣,它能夠存放各種類(lèi)型的對(duì)象??梢院?jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類(lèi)型的動(dòng)態(tài)數(shù)組。
1.1 vector和普通數(shù)組區(qū)別
普通數(shù)組是靜態(tài)的,在初始化是就確定空間大小,不支持動(dòng)態(tài)擴(kuò)展;
vector則可以看做是一個(gè)動(dòng)態(tài)的數(shù)組,可以存放任意數(shù)據(jù)(基本數(shù)據(jù)類(lèi)型和自定義數(shù)據(jù)類(lèi)型均可以),支持動(dòng)態(tài)擴(kuò)展空間;
2.vector容器的構(gòu)造函數(shù)
vector容器,可以看做是一個(gè)單端數(shù)組,構(gòu)造函數(shù)有:無(wú)參構(gòu)造、有參構(gòu)造、拷貝構(gòu)造。
vector 容器:--->單端數(shù)組
vector和普通數(shù)組的區(qū)別:
普通數(shù)組是靜態(tài)空間,創(chuàng)建是就分配好
vector支持動(dòng)態(tài)擴(kuò)展
vector容器常用迭代器:
v.rend() -->指向第一個(gè)元素的前一個(gè)位置
v.end() -->指向最后一個(gè)元素的下一個(gè)位置
v.begin() -->指向最后一個(gè)元素
vector容器的迭代器是支持隨機(jī)訪(fǎng)問(wèn)的迭代器
vector構(gòu)造函數(shù):
無(wú)參構(gòu)造:vector v;
有參構(gòu)造:vector(v.begin(),b.end()); --將begin到end之間的內(nèi)容拷貝
vector(n,elem); //將n個(gè)elem內(nèi)容拷貝
拷貝構(gòu)造:vector(const vector &v);
vector構(gòu)造函數(shù)使用示例:
#include
using namespace std;
#include
void PrintVector(const vector& ptr)
{
//若傳入的vector是一個(gè)常量,則才是需要迭代器是需要使用:const_iterator
for ( vector:: const_iterator v = ptr.begin(); v != ptr.end(); v++)
{
cout < *v < " ";
}
cout < endl;
}
void test()
{
vector vtr;//默認(rèn)構(gòu)造
for (int i = 0; i < 5; i++)
{
vtr.push_back(i);
}
PrintVector(vtr);
vector v2(vtr.begin(), vtr.end());//將begin~end之間的內(nèi)容拷貝
PrintVector(v2);
vector v3(10, 5);//賦值10個(gè)5
PrintVector(v3);
vectorv4(v3);//拷貝構(gòu)造
PrintVector(v4);
}
int main()
{
test();
system("pause");
}
3.vector賦值
vector賦值可以直接"="賦值,也可以使用成員函數(shù)assign賦值。
vector賦值:
vector &operator=(const vector &v);//重載=
assign(beg,end);//將beg~end區(qū)間進(jìn)行賦值
assign(n,elem);//n個(gè)elem賦值
賦值操作示例:
#include
using namespace std;
#include
void PrintVector(const vector& p)
{
for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr< " ";
}
cout < endl;
}
void test()
{
vector v;
for (int i = 0; i < 5; i++)
{
v.push_back(i);
}
PrintVector(v);
vector v2 = v;//等號(hào)賦值
PrintVector(v2);
vector v3(v.begin(), v.end());//區(qū)間賦值
PrintVector(v3);
vector v4(5, 666);//5個(gè)666賦值
PrintVector(v4);
}
int main()
{
test();
system("pause");
}
4.vector獲取容量和成員個(gè)數(shù)
vector和普通數(shù)組一樣,下標(biāo)是從0開(kāi)始的。獲取容量大小使用capacity()函數(shù),判斷容器是否為空可以使用empty()函數(shù),獲取成員個(gè)數(shù)使用size()函數(shù)。還可以使用resize函數(shù)指定容器大?。?/p>
vector容器的容量和成員個(gè)數(shù):
判斷vector容器是否為空:empty()
容量:capacity()
容器中的元素個(gè)數(shù):size()
指定容器長(zhǎng)度為num:resize(int num);
若容器變長(zhǎng),則以默認(rèn)值填充,默認(rèn)值為0
若容器變小,則末尾超出的元素將被刪除
指向容器的長(zhǎng)度為num:resize(int num,elem);
若容器變長(zhǎng),則用elem填充
若容器變小,則末尾超出的元素將被刪除
使用示例:
#include
using namespace std;
#include
void PrintVector(const vector& p)
{
for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
cout < "容量:" < p.capacity();
cout < endl;
cout < "元素個(gè)數(shù):" < p.size();
cout < endl;
}
void test()
{
vector vtr;
for (int i = 0; i < 5; i++)
{
vtr.push_back(i);
}
PrintVector(vtr);
//指定容器長(zhǎng)度
vtr.resize(10,666);//指定長(zhǎng)度為10,超出則用666填充
PrintVector(vtr);
vtr.resize(3);//指定長(zhǎng)度小于實(shí)際長(zhǎng)度,則會(huì)刪除超出的元素,但空間超出的空間還是存在
PrintVector(vtr);
vectorv2;
v2.resize(5);//沒(méi)有指定填充值則默認(rèn)為0
if (v2.empty())
{
cout < "v2為空" < endl;
}
PrintVector(v2);
}
int main()
{
test();
system("pause");
}
注意:在resize()函數(shù)時(shí),若指定的大小比原空間大,則容器會(huì)進(jìn)行擴(kuò)充;若指定的大小比原空間小,則會(huì)將超出的成員刪除,但空間大小不就刪除。
5.vector容器成員刪除與插入
vector容器是一個(gè)單端數(shù)組,通過(guò)bush_back()函數(shù)可以實(shí)現(xiàn)從末尾插入數(shù)據(jù)。
pop_back()從末尾刪除數(shù)據(jù);
從指定位置插入數(shù)據(jù)可以使用insert()成員函數(shù),該函數(shù)有多個(gè)重載版本。
要從指定位置刪除數(shù)據(jù)可以使用erase()成員函數(shù),該函數(shù)有多個(gè)重載版本;
clear()函數(shù)實(shí)現(xiàn)清空容器。
vector插入與刪除:
push_back();//尾插
pop_back();//尾刪
insert(const_iterator pos,elem);//迭代器指向位置pos插入元素elem
insert(const_iterator pos,int count,elem)//迭代器指向位置pos插入count個(gè)元素elem
erase(const_iterator pos);//刪除迭代器指向的元素
erase(const_iterator start,const_iterator end);//刪除迭代器start~end之間的元素
clear();//刪除容器中所有元素
實(shí)現(xiàn)示例:
#include
using namespace std;
#include
class Person
{
friend ostream& operator<(ostream& cout, const Person& per);
public:
Person() {
}
Person(int age, string name) :age(age), name(name)
{
}
Person& operator=(Person p)
{
this-?>age = p.age;
this->name = p.name;
return *this;
}
private:
int age;
string name;
};
ostream& operator<(ostream& cout, const Person &per)
{
cout < "姓名:" < per.name < "t年齡:" < per.age;
return cout;
}
void PrintVector(const vector& p)
{
for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < endl;
}
}
void test()
{
//實(shí)例化對(duì)象
Person v1(18,"小王");
Person v2(18, "小李");
Person v3(18, "小劉");
Person v4(18, "小陳");
Person v5(18, "小蔣");
Person v[5] = { v1,v2,v3,v4,v5 };
for (int i = 0; i < sizeof(v) / sizeof(v[0]); i++)
{
cout < v[i] < endl;
}
cout < "--------------------vector-------------------" < endl;
//創(chuàng)建容器
vector vtr;
//尾插
for (int i = 0; i < 5; i++)
{
vtr.push_back(v[i]);//賦值
}
PrintVector(vtr);
//尾刪
cout < "t尾刪" < endl;
vtr.pop_back();
PrintVector(vtr);
//插入
cout < "t插入" < endl;
Person temp(24, "老呂");
vtr.insert(vtr.begin(), temp);
PrintVector(vtr);
cout < "t第三個(gè)位置插入3個(gè)值" < endl;
vector::iterator ptr = vtr.begin();
ptr += 3;
vtr.insert(ptr, 3,temp);
PrintVector(vtr);
cout < "t刪除首位置的值" < endl;
vtr.erase(vtr.begin());
PrintVector(vtr);
cout < "t刪除第3個(gè)位置到第6個(gè)位置的值" < endl;
ptr = vtr.begin();
vtr.erase(ptr+3, ptr+6);
PrintVector(vtr);
cout < "t清空" < endl;
vtr.clear();//或者使用vtr.erase(vtr.begin(),vtr.end);
PrintVector(vtr);
cout < "空間大小:" < vtr.capacity();
cout < endl;
cout < "元素個(gè)數(shù):" < vtr.size();
cout < endl;
}
int main()
{
test();
system("pause");
}
6.vector容器數(shù)據(jù)存取
vector容器也可以像普通數(shù)組一樣同[]訪(fǎng)問(wèn)成員,此外還可以使用at()成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě);
vector數(shù)據(jù)存取
at(int idx);//返回下標(biāo)對(duì)應(yīng)的內(nèi)容
operator[];//重載[]
front();//返回容器中第一個(gè)元素
back();//返回容器中最后一個(gè)元素
實(shí)現(xiàn)示例:
#include
using namespace std;
#include
#include
void PrintVector(int val)
{
cout < val < " ";
}
void test()
{
vector vtr;
for (int i = 0; i < 5; i++)
{
vtr.push_back(i);
}
for_each(vtr.begin(), vtr.end(), PrintVector);
cout < endl;
cout < "第一個(gè)值:" < vtr.front() < endl;
cout < "最后一個(gè)值:" < vtr.back() < endl;
vtr[0] = 100;
cout < "vtr[0]=" < vtr.at(0) < endl;
}
int main()
{
test();
system("pause");
}
7.vector容器互換元素
在vector容器中,可以通過(guò)成員函數(shù)swap()函數(shù)實(shí)現(xiàn)兩個(gè)容器的成員互換。
注意:swap互換元素同時(shí)也可將空間大小進(jìn)行互換。
vector容器互換
swap(vec);//將vec中的元素和本身的元素互換
注意:swap互換元素同時(shí)也可將空間大小進(jìn)行互換
使用示例:
#include
#include
using namespace std;
void PrintVector(const vector& p)
{
for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
}
void test()
{
vector vtr(10,666);
vector vtr2;
for (int i = 0; i < 5; i++)
{
vtr2.push_back(i);
}
cout < "t互換前" < endl;
PrintVector(vtr);
PrintVector(vtr2);
cout < "vtr大?。? < vtr.capacity() < "t元素個(gè)數(shù):"(vtr).swap(vtr);
/*
vector(vtr) --使用匿名對(duì)象,將匿名對(duì)象初始化為vtr
vector(vtr).swap(vtr); --在通過(guò)swap函數(shù)和匿名對(duì)象互換,此時(shí)即可實(shí)現(xiàn)收縮內(nèi)存
*/
cout < "vtr大?。? < vtr.capacity() < "t元素個(gè)數(shù):" < vtr.size() < endl;
}
int main()
{
test();
cout < "------------------test02示例------------------------" < endl;
test02();
system("pause");
}
()
由于swap函數(shù)不僅可以互換元素,而且空間也大小也是可以互換的,所以有些清空下可以使用swap()函數(shù)來(lái)合理使用空間,避免空間資源浪費(fèi)。
8.vector容器預(yù)留空間
reserve()成員函數(shù)可以指定空間大小,為vector容器預(yù)留空間。
reserve函數(shù)和resize()函數(shù)區(qū)別:
resize()函數(shù)指定大小后會(huì)直接初始化空間;
reserve()函數(shù)指定的大小不會(huì)初始化空間,預(yù)留的空間不能直接訪(fǎng)問(wèn),必須在賦值之后采用訪(fǎng)問(wèn)。
reserve(int len);//容器預(yù)留len長(zhǎng)度的元素,預(yù)留位置初始化,元素不可訪(fǎng)問(wèn)
使用示例:
#include
using namespace std;
#include
void test()
{
vectorvtr;
vtr.reserve(10);
cout < "空間大小:" < vtr.capacity() < "元素個(gè)數(shù):" vtr2;
vtr2.resize(10);//指定長(zhǎng)度
cout < "空間大小:" < vtr2.capacity() < "元素個(gè)數(shù):" < vtr2.size() < endl;
}
void test02()
{
vector vtr;
int* p=NULL;
cout < "不適用預(yù)留空間:" < endl;
int num = 0;
for (int i = 0; i < 100000; i++)
{
vtr.push_back(i);
if (p != &vtr[0])
{
p = &vtr[0];
num++;
}
}
cout < "動(dòng)態(tài)擴(kuò)展空間次數(shù):" < num vtr2;
vtr2.reserve(100000);//預(yù)留100000空間
p = NULL;
cout < "使用預(yù)留空間:" < endl;
num = 0;
for (int i = 0; i < 100000; i++)
{
vtr2.push_back(i);
if (p != &vtr2[0])
{
p = &vtr2[0];
num++;
}
}
cout < "動(dòng)態(tài)擴(kuò)展空間次數(shù):" < num < endl;
}
int main()
{
test();
cout < "t示例2:" < endl;
test02();
system("pause");
}
;>()
vector容器空間是根據(jù)成員來(lái)動(dòng)態(tài)擴(kuò)展,若一開(kāi)始就知道使用的空間大概需要多大,則可以使用reserve()函數(shù)來(lái)指定,從而可以減少中間動(dòng)態(tài)擴(kuò)展的次數(shù)。
-
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93685 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22060 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73618 -
Vector
+關(guān)注
關(guān)注
3文章
60瀏覽量
8594
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論