0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

c++之vector容器

wang123a ? 2023-07-13 19:36 ? 次閱讀

1.vector容器介紹

向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象??梢院?jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(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ù)類型和自定義數(shù)據(jù)類型均可以),支持動(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ī)訪問(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  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");
}
wKgZomSv2dyANGmgAALIlQzu9cY116.png

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  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");
}
wKgaomSv2puAN66aAALc77zFNXE786.png

4.vector獲取容量和成員個(gè)數(shù)

vector和普通數(shù)組一樣,下標(biāo)是從0開(kāi)始的。獲取容量大小使用capacity()函數(shù),判斷容器是否為空可以使用empty()函數(shù),獲取成員個(gè)數(shù)使用size()函數(shù)。還可以使用resize函數(shù)指定容器大小;

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  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 
wKgaomSv24mABKARAAO2e0Y2Q9w752.png

注意:在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& operatorage = p.age;
		this->name = p.name;
		return *this;
	}
private:
	int age;
	string name;
};
ostream& operator& p)
{
	for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  vtr;
	//尾插
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(v[i]);//賦值
	}
	PrintVector(vtr);
	//尾刪
	cout ::iterator ptr = vtr.begin();
	ptr += 3;
	vtr.insert(ptr, 3,temp);
	PrintVector(vtr);
	cout 
wKgZomSv3WWAKvBYAAT-rJKRpyw339.png

6.vector容器數(shù)據(jù)存取

vector容器也可以像普通數(shù)組一樣同[]訪問(wèn)成員,此外還可以使用at()成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)讀寫;


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  vtr;
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	for_each(vtr.begin(), vtr.end(), PrintVector);
	cout 
wKgaomSv3heAPYvKAALUr9jea_Q850.png

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  vtr(10,666);
	vector vtr2;
	for (int i = 0; i < 5; i++)
	{
		vtr2.push_back(i);
	}
	cout (vtr).swap(vtr);
	/*
	vector(vtr) --使用匿名對(duì)象,將匿名對(duì)象初始化為vtr

	vector(vtr).swap(vtr);  --在通過(guò)swap函數(shù)和匿名對(duì)象互換,此時(shí)即可實(shí)現(xiàn)收縮內(nèi)存
	*/
	cout 
wKgZomSv3saAamAzAARsMxTqc4E565.png

由于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ù)留的空間不能直接訪問(wèn),必須在賦值之后采用訪問(wèn)。

reserve(int len);//容器預(yù)留len長(zhǎng)度的元素,預(yù)留位置初始化,元素不可訪問(wèn)

使用示例:

#include 
using namespace std;
#include 
void test()
{
	vectorvtr;
	vtr.reserve(10);
	cout  vtr;
	int* p=NULL;
	cout ()
wKgaomSv4CGAeE98AAM-byLJiz0642.png

vector容器空間是根據(jù)成員來(lái)動(dòng)態(tài)擴(kuò)展,若一開(kāi)始就知道使用的空間大概需要多大,則可以使用reserve()函數(shù)來(lái)指定,從而可以減少中間動(dòng)態(tài)擴(kuò)展的次數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93268
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    490

    瀏覽量

    21986
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
  • Vector
    +關(guān)注

    關(guān)注

    3

    文章

    53

    瀏覽量

    8522
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    c++值deque容器

    deque 是 double-ended queue 的縮寫,又稱雙端隊(duì)列容器。deque容器支持從頭部和尾部雙端插入、刪除數(shù)據(jù)。與vector容器不同的是,
    的頭像 發(fā)表于 07-14 08:49 ?616次閱讀
    <b class='flag-5'>c++</b>值deque<b class='flag-5'>容器</b>

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?856次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1070次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1020次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    ccs如何使用C語(yǔ)言的“容器”?

    c++/c標(biāo)準(zhǔn)庫(kù)有一個(gè)“容器”的東西,“vector”。我現(xiàn)在用的是ccs3.3,已經(jīng)發(fā)現(xiàn)在安裝路徑下有“vector.h”的頭文件,以及相
    發(fā)表于 05-08 19:49

    C++ vector刪除符合條件元素的編程技巧

    C++ vector中實(shí)際刪除元素使用的是容器vecrot中std::vector::erase()方法。 C++ 中std::remove
    的頭像 發(fā)表于 09-20 10:03 ?5273次閱讀

    C++vector的定義與初始化

    C++中的vector vector(向量)是一種序列式容器,類似于數(shù)組,但比數(shù)組更優(yōu)越。一般來(lái)說(shuō)數(shù)組不能動(dòng)態(tài)拓展,因此在程序運(yùn)行的時(shí)候不是浪費(fèi)內(nèi)存,就是造成越界。而
    的頭像 發(fā)表于 02-02 16:41 ?8859次閱讀
    <b class='flag-5'>C++</b>中<b class='flag-5'>vector</b>的定義與初始化

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用
    發(fā)表于 11-16 15:59 ?3次下載

    C++入門string

    前一篇文章我們已經(jīng)了解了C++中的基本類型,C++還提供了很多抽象數(shù)據(jù)類型,例如字符串string,string包含多個(gè)字符,以及可變長(zhǎng)度的vector,vector可以包含多個(gè)同一類
    的頭像 發(fā)表于 03-17 13:58 ?479次閱讀

    C++入門數(shù)組的概念

    上一篇文章我們介紹了C++中的迭代器,這篇文章將會(huì)介紹C++中數(shù)組的概念,數(shù)組是一種和vector類似的數(shù)據(jù)結(jié)構(gòu),但是其在性能和靈活性上的權(quán)衡中選擇了性能而放棄了一定的靈活性,其與vector
    的頭像 發(fā)表于 03-17 14:14 ?614次閱讀

    C++學(xué)習(xí)筆記順序容器

    C++中的順序容器是一種用于存儲(chǔ)和管理元素序列的數(shù)據(jù)結(jié)構(gòu)。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標(biāo)準(zhǔn)庫(kù)中提供了多種順序容器,包括
    的頭像 發(fā)表于 05-11 17:05 ?506次閱讀

    C++入門通用算法

    C++ 是一種強(qiáng)大的編程語(yǔ)言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過(guò)迭代器來(lái)操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細(xì)介紹
    的頭像 發(fā)表于 05-17 09:40 ?570次閱讀

    動(dòng)態(tài)數(shù)組和C++ std::vector詳解

    std::vectorC++的默認(rèn)動(dòng)態(tài)數(shù)組,其與array最大的區(qū)別在于vector的數(shù)組是動(dòng)態(tài)的,即其大小可以在運(yùn)行時(shí)更改。std::vector是封裝動(dòng)態(tài)數(shù)組的順序
    的頭像 發(fā)表于 07-19 11:07 ?871次閱讀

    使用C++ sort函數(shù)對(duì)vector進(jìn)行自定義排序

    今天在學(xué)一些C++ STL容器,看到sort函數(shù)允許自定義排序規(guī)則,小小地實(shí)操了一下。
    的頭像 發(fā)表于 07-22 10:12 ?1534次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《
    的頭像 發(fā)表于 10-30 16:35 ?696次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖