0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++之vector容器

wang123a 2023-07-13 19:36 次阅读

1.vector容器介绍

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

1.1 vector和普通数组区别

普通数组是静态的,在初始化是就确定空间大小,不支持动态扩展;

vector则可以看做是一个动态的数组,可以存放任意数据(基本数据类型和自定义数据类型均可以),支持动态扩展空间;

2.vector容器的构造函数

vector容器,可以看做是一个单端数组,构造函数有:无参构造、有参构造、拷贝构造。

vector 容器:--->单端数组
vector和普通数组的区别:
	普通数组是静态空间,创建是就分配好
	vector支持动态扩展
vector容器常用迭代器:
	v.rend() -->指向第一个元素的前一个位置
	v.end()  -->指向最后一个元素的下一个位置
	v.begin() -->指向最后一个元素
	vector容器的迭代器是支持随机访问的迭代器
vector构造函数:
	无参构造:vector< T > v;
	有参构造:vector(v.begin(),b.end());  --将begin到end之间的内容拷贝
			  vector(n,elem); //将n个elem内容拷贝
	拷贝构造:vector(const vector &v);

vector构造函数使用示例:

#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& ptr)
{
	//若传入的vector是一个常量,则才是需要迭代器是需要使用:const_iterator
	for ( vector< int >:: const_iterator v = ptr.begin(); v != ptr.end(); v++)
	{
		cout < < *v < < " ";
	} 
	cout < < endl;
}
void test()
{
	vector< int > vtr;//默认构造
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	PrintVector(vtr);
	vector< int > v2(vtr.begin(), vtr.end());//将begin~end之间的内容拷贝
	PrintVector(v2);
	vector< int > v3(10, 5);//赋值10个5
	PrintVector(v3);
	vector< int >v4(v3);//拷贝构造
	PrintVector(v4);
}
int main()
{
	test();
	system("pause");
}
wKgZomSv2dyANGmgAALIlQzu9cY116.png

3.vector赋值

vector赋值可以直接"="赋值,也可以使用成员函数assign赋值。


vector赋值:
	vector &operator=(const vector &v);//重载=
	assign(beg,end);//将beg~end区间进行赋值
	assign(n,elem);//n个elem赋值

赋值操作示例:

#include < iostream >
using namespace std;
#include < vector >

void PrintVector(const vector< int >& p)
{
	for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout < < *ptr< < " ";	
	}
	cout < < endl;


}
void test()
{
	vector< int > v;
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);
	}
	PrintVector(v);
	vector< int > v2 = v;//等号赋值
	PrintVector(v2);
	vector< int > v3(v.begin(), v.end());//区间赋值
	PrintVector(v3);
	vector< int > v4(5, 666);//5个666赋值
	PrintVector(v4);
}
int main()
{
	test();
	system("pause");
}
wKgaomSv2puAN66aAALc77zFNXE786.png

4.vector获取容量和成员个数

vector和普通数组一样,下标是从0开始的。获取容量大小使用capacity()函数,判断容器是否为空可以使用empty()函数,获取成员个数使用size()函数。还可以使用resize函数指定容器大小;

vector容器的容量和成员个数:
判断vector容器是否为空:empty()
容量:capacity()
容器中的元素个数:size()
指定容器长度为num:resize(int num);
	若容器变长,则以默认值填充,默认值为0
	若容器变小,则末尾超出的元素将被删除
指向容器的长度为num:resize(int num,elem);
	若容器变长,则用elem填充
	若容器变小,则末尾超出的元素将被删除

使用示例:

#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& p)
{
	for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout < < *ptr < < " ";
	}
	cout < < endl;
	cout < < "容量:" < < p.capacity();
	cout < < endl;
	cout < < "元素个数:" < < p.size();
	cout < < endl;
}
void test()
{
	vector< int > vtr;
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	PrintVector(vtr);
	//指定容器长度
	vtr.resize(10,666);//指定长度为10,超出则用666填充
	PrintVector(vtr);
	vtr.resize(3);//指定长度小于实际长度,则会删除超出的元素,但空间超出的空间还是存在
	PrintVector(vtr);

	vector< int >v2;
	v2.resize(5);//没有指定填充值则默认为0
	if (v2.empty())
	{
		cout < < "v2为空" < < endl;
	}
	PrintVector(v2);
}
int main()
{
	test();
	system("pause");
}
wKgaomSv24mABKARAAO2e0Y2Q9w752.png

注意:在resize()函数时,若指定的大小比原空间大,则容器会进行扩充;若指定的大小比原空间小,则会将超出的成员删除,但空间大小不就删除。

5.vector容器成员删除与插入

vector容器是一个单端数组,通过bush_back()函数可以实现从末尾插入数据。

pop_back()从末尾删除数据;

从指定位置插入数据可以使用insert()成员函数,该函数有多个重载版本。

要从指定位置删除数据可以使用erase()成员函数,该函数有多个重载版本;

clear()函数实现清空容器。


vector插入与删除:
	push_back();//尾插
	pop_back();//尾删
	insert(const_iterator pos,elem);//迭代器指向位置pos插入元素elem
	insert(const_iterator pos,int count,elem)//迭代器指向位置pos插入count个元素elem
	erase(const_iterator pos);//删除迭代器指向的元素
	erase(const_iterator start,const_iterator end);//删除迭代器start~end之间的元素
	clear();//删除容器中所有元素

实现示例:

#include < iostream >
using namespace std;
#include < vector >
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< Person >& p)
{
	for (vector< Person >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout < < *ptr < < endl;
	}
}
void test()
{
	//实例化对象
	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;
	//创建容器
	vector< Person > 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第三个位置插入3个值" < < endl;
	vector< Person >::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个位置到第6个位置的值" < < 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 < < "元素个数:" < < vtr.size();
	cout < < endl;
}
int main()
{
	test();
	system("pause");
}
wKgZomSv3WWAKvBYAAT-rJKRpyw339.png

6.vector容器数据存取

vector容器也可以像普通数组一样同[]访问成员,此外还可以使用at()成员函数实现数据读写;


vector数据存取
	at(int idx);//返回下标对应的内容
	operator[];//重载[]
	front();//返回容器中第一个元素
	back();//返回容器中最后一个元素

实现示例:

#include < iostream >
using namespace std;
#include < vector >
#include < algorithm >

void PrintVector(int val)
{
	cout < < val < < " ";
}
void test()
{
	
	vector< int > vtr;
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	for_each(vtr.begin(), vtr.end(), PrintVector);
	cout < < endl;
	cout < < "第一个值:" < < vtr.front() < < endl;
	cout < < "最后一个值:" < < vtr.back() < < endl;
	vtr[0] = 100;
	cout < < "vtr[0]=" < < vtr.at(0) < < endl;
	
}

int main()
{
	test();
	system("pause");
}

wKgaomSv3heAPYvKAALUr9jea_Q850.png

7.vector容器互换元素

在vector容器中,可以通过成员函数swap()函数实现两个容器的成员互换。

注意:swap互换元素同时也可将空间大小进行互换。


vector容器互换
swap(vec);//将vec中的元素和本身的元素互换
注意:swap互换元素同时也可将空间大小进行互换

使用示例:

#include < iostream >
#include < vector >
using namespace std;


void PrintVector(const vector< int >& p)
{
	for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout < < *ptr < < " ";
	}
	cout < < endl;
}
void test()
{
	vector< int > vtr(10,666);
	vector< int > vtr2;
	for (int i = 0; i < 5; i++)
	{
		vtr2.push_back(i);
	}
	cout < < "t互换前" < < endl;
	PrintVector(vtr);
	PrintVector(vtr2);
	cout < < "vtr大小:" < < vtr.capacity() < < "t元素个数:"< vtr;
	//初始化
	for (int i = 0; i < 100000; i++)
	{
		vtr.push_back(i);
	}
	cout < < "vtr大小:" < < vtr.capacity() < < "t元素个数:" < < vtr.size() < < endl;
	vtr.resize(5);//重新指定长度为5
	cout < < "vtr大小:" < < vtr.capacity() < < "t元素个数:" < < vtr.size() < < endl;
	vector< int >(vtr).swap(vtr);
	/*
	vector< int >(vtr) --使用匿名对象,将匿名对象初始化为vtr

	vector< int >(vtr).swap(vtr);  --在通过swap函数和匿名对象互换,此时即可实现收缩内存
	*/
	cout < < "vtr大小:" < < vtr.capacity() < < "t元素个数:" < < vtr.size() < < endl;
}
int main()
{
	test();
	cout < < "------------------test02示例------------------------" < < endl;
	test02();
	system("pause");
}
()< 
wKgZomSv3saAamAzAARsMxTqc4E565.png

由于swap函数不仅可以互换元素,而且空间也大小也是可以互换的,所以有些清空下可以使用swap()函数来合理使用空间,避免空间资源浪费。

8.vector容器预留空间

reserve()成员函数可以指定空间大小,为vector容器预留空间。

reserve函数和resize()函数区别:

resize()函数指定大小后会直接初始化空间;

reserve()函数指定的大小不会初始化空间,预留的空间不能直接访问,必须在赋值之后采用访问。

reserve(int len);//容器预留len长度的元素,预留位置初始化,元素不可访问

使用示例:

#include < iostream >
using namespace std;
#include < vector >
void test()
{
	vector< int >vtr;
	vtr.reserve(10);
	cout < < "空间大小:" < < vtr.capacity() < < "元素个数:"<  vtr2;
	vtr2.resize(10);//指定长度
	cout < < "空间大小:" < < vtr2.capacity() < < "元素个数:" < < vtr2.size() < < endl;
}

void test02()
{
	vector< int > vtr;
	int* p=NULL;
	cout < < "不适用预留空间:" < < endl;
	int num = 0;
	for (int i = 0; i < 100000; i++)
	{
		vtr.push_back(i);
		if (p != &vtr[0])
		{
			p = &vtr[0];
			num++;
		}
	}
	cout < < "动态扩展空间次数:" < < num<  vtr2;
	vtr2.reserve(100000);//预留100000空间
	p = NULL;
	cout < < "使用预留空间:" < < endl;
	num = 0;
	for (int i = 0; i < 100000; i++)
	{
		vtr2.push_back(i);
		if (p != &vtr2[0])
		{
			p = &vtr2[0];
			num++;
		}
	}
	cout < < "动态扩展空间次数:" < < num < < endl;

}
int main()
{
	test();
	cout < < "t示例2:" < < endl;
	test02();
	system("pause");
}
;>()< 
wKgaomSv4CGAeE98AAM-byLJiz0642.png

vector容器空间是根据成员来动态扩展,若一开始就知道使用的空间大概需要多大,则可以使用reserve()函数来指定,从而可以减少中间动态扩展的次数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3615

    浏览量

    93722
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62604
  • 容器
    +关注

    关注

    0

    文章

    495

    浏览量

    22061
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73642
  • Vector
    +关注

    关注

    3

    文章

    60

    浏览量

    8599
收藏 人收藏

    评论

    相关推荐

    c++值deque容器

    deque 是 double-ended queue 的缩写,又称双端队列容器。deque容器支持从头部和尾部双端插入、删除数据。与vector容器不同的是,
    的头像 发表于 07-14 08:49 804次阅读
    <b class='flag-5'>c++</b>值deque<b class='flag-5'>容器</b>

    C++STL算法(二)

    C++STL算法(二)
    的头像 发表于 07-18 14:49 1051次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的头像 发表于 07-18 15:00 1293次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的头像 发表于 07-21 10:52 1115次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    ccs如何使用C语言的“容器”?

    c++/c标准库有一个“容器”的东西,“vector”。我现在用的是ccs3.3,已经发现在安装路径下有“vector.h”的头文件,以及相
    发表于 05-08 19:49

    C++ vector删除符合条件元素的编程技巧

    C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。 C++ 中std::remove
    的头像 发表于 09-20 10:03 5420次阅读

    C++vector的定义与初始化

    C++中的vector vector(向量)是一种序列式容器,类似于数组,但比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而
    的头像 发表于 02-02 16:41 9084次阅读
    <b class='flag-5'>C++</b>中<b class='flag-5'>vector</b>的定义与初始化

    C++设计新思维-泛型编程与设计应用

    C++设计新思维-泛型编程与设计应用
    发表于 11-16 15:59 3次下载

    C++入门string

    前一篇文章我们已经了解了C++中的基本类型,C++还提供了很多抽象数据类型,例如字符串string,string包含多个字符,以及可变长度的vectorvector可以包含多个同一类
    的头像 发表于 03-17 13:58 567次阅读

    C++入门数组的概念

    上一篇文章我们介绍了C++中的迭代器,这篇文章将会介绍C++中数组的概念,数组是一种和vector类似的数据结构,但是其在性能和灵活性上的权衡中选择了性能而放弃了一定的灵活性,其与vector
    的头像 发表于 03-17 14:14 692次阅读

    C++学习笔记顺序容器

    C++中的顺序容器是一种用于存储和管理元素序列的数据结构。它们提供了一组有序的元素,并支持在序列的任意位置插入和删除元素。C++标准库中提供了多种顺序容器,包括
    的头像 发表于 05-11 17:05 596次阅读

    C++入门通用算法

    C++ 是一种强大的编程语言,它提供了许多通用算法,可以用于各种容器类型。这些算法是通过迭代器来操作容器中的元素,因此它们是通用的,可以用于不同类型的容器。在本篇博客中,我们将详细介绍
    的头像 发表于 05-17 09:40 670次阅读

    动态数组和C++ std::vector详解

    std::vectorC++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序
    的头像 发表于 07-19 11:07 974次阅读

    使用C++ sort函数对vector进行自定义排序

    今天在学一些C++ STL容器,看到sort函数允许自定义排序规则,小小地实操了一下。
    的头像 发表于 07-22 10:12 1671次阅读

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《
    的头像 发表于 10-30 16:35 853次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图