【C++】vector的简单使用

在这里插入图片描述
最近在C++中频繁的使用到了vector,给我的第一感觉就是这个容器太强大了,简直就是一切皆可装,而且它的容量一般也不需要关心,编译器也会根据你的vector中所装元素的数量进行动态的分配容量,可以把它看作是一个加强版的数组;

1.vector定义

在需要使用到vector的工程中首先需要引入相关头文件
#include <vector>

定义初始化vector:

简单理解就是:< >中是表示装入vector的数据类型,然后是数组名;

vector<int> vec;//默认size=0,capacity=0
vector<int> vec(10);//初始化size=10,capacity=10,所有元素默认值为0
vector<int> vec(10666);//初始化size=10,capacity=10,所有元素默认值为666
vector<int> vec_2(vec);//定义一个和vec完全相同的vector
vector<vector<float>> vec;//vector中装入vector类型的元素
vector<Point> vec;
...

vector的大小(size)是指已经初始化的元素数量,容量(capacity)则是指当前最多能够装进去多少元素;


这里顺便提一下vector的容量分配的规则:

我在VS中实验的结果是:容量按照1.5倍的规则进行分配,在网上也有看到说这与系统等有关,有的则是按照两倍的原则进行分配,以下代码是我在VS中验证的结果:

    ...
	vector<int> vec(10);
	cout << "vec.size:    " << vec.size() << endl;
	cout << "vec.capacity:" << vec.capacity() << endl;
	cout << "------------------------"<< endl;
	vec.push_back(1);
	cout << "vec.size:    " << vec.size() << endl;
	cout << "vec.capacity:" << vec.capacity() << endl;
	...

运行结果:
在这里插入图片描述

2.访问元素

直接通过下标 i 访问vector内指定的元素:

利用vec[i]或vec.at(i)访问指定元素;例:

vector<int> vec(10,666);
cout << vec[1] << endl;
cout << vec.at(5) << endl;

使用迭代器 iterator 访问vector内元素的值:

vec.begin():得到vec的头指针;
vec.end():得到vec的尾指针(最后一个元素的下一个单元的指针);
例:

int main()
{
	vector<int> vec;
	for (int i = 0; i < 10; i++)//初始化
	{
		v.push_back(i);
	}
	vector<int>::iterator iter = vec.begin();
	while (iter != vec.end())
	{
	    cout << "Value of vec[" << j << "] = " << *iter << endl;
		iter++;
	}
	return 0;
}

运行结果:
在这里插入图片描述

注:这的begin()和end()是一对,返回的都是迭代器类型的指针;


返回vector中最后一个元素:

vector::back( ):返回的是vector最后一个元素;例:

cout << vec.back() << endl;

返回vector中第一个元素:

vector::front( ):返回的是vector第一个元素;例:

cout << vec.front() << endl;

注:这的front()和back()是一对,返回的是首末元素;


获取vector的容量和大小:

vector::size():函数显示vecytor的实际大小;例:

cout << vec.size() << endl;

vector::capacity():函数显示vecytor的容量;例:

cout << vec.capacity() << endl;

3.插入元素

在末尾插入元素:

vector::push_back(x):在vector的末尾插入一个元素x,如果有必要会自动扩充容量。

vector::push_back()

4.删除元素

删除最后一个元素:

vector::pop_back(),例:

vec.pop_back();

删除指定位置元素:

vector::erase(iterator),例:

vector<int>::iterator iter = vec.begin();
vec.erase(iter+5);//删除指定下标出元素
//不用迭代器
vec.erase(iter+5);

删除指定范围元素:
vector<int> temp(0);
temp.erase(temp.begin()+5,temp.begin()+10);//删除temp中指定范围的元素

清空vector中所有的元素:

vector::clear(),例:

vec.clear();

注:清空后容量capacity不变,size变为0,删除元素同理;

5.传参

函数中形参的定义:

void Init(vector &v);
例:

void Init(vector<int> &v)
{
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
}

函数调用时实参的传入:

Init(vec);
例:

int main()
{
    vector<int> vec;
    Init(vec);
	for (int j = 0; j < vec.size(); j++)
	{
		cout << "Value of vec[" << j << "] = " << vec[j] << endl;
	}
	return 0;
}

运行结果:
在这里插入图片描述
更多关于vector参数传递的方式参考博客:C++(笔记)容器(vector)作为函数参数如何传参


6.排序

6.1 普通的1纬数组排序

sort(a.begin(), a.end());

6.2按自定义结构体进行排序

struct Area//结构体定义
{
	int id;
	double area;
};

bool cmp_area(const struct Area &a, const struct Area &b)
{
	return a.area > b.area;//进行从大到小排序
	//return a.area < b.area;//进行从小到大排序
}

vector<struct Area> convex_area(contours.size());
sort(convex_area.begin(), convex_area.end(),cmp_area);//对convex_area按area大小进行排序

其他参考博客:
1.C++ 中vector的用法详解

2.C++ 中vector的使用方法

  • 19
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vector<vector<int>>是一种二维动态数组的数据结构,可以用来存储多行多列的数据。 有两种常见的方法来定义和初始化vector<vector<int>>。方法一是使用vector的构造函数,可以指定容器的大小和初始值。比如,可以使用vec(2,vector<int>(2,0))来定义一个包含两个vector容器的vec,其中每个vector容器都包含两个初始值为0的元素。 方法二是使用花括号的方式直接初始化vector<vector<int>>。比如,可以使用vec = {{1,2},{3,4}}来定义一个包含两个vector容器的vec,并将每个vector容器初始化为特定的值。 在向vector<vector<int>>中插入元素时,可以使用push_back函数将元素添加到vector容器中。需要注意的是,插入元素时,要确保对应的vector容器已经存在,否则会出错。比如,可以使用vec.push_back(0)来向第一个vector容器中插入一个元素。 可以通过size()函数来获取vector<vector<int>>的长度和每个vector容器的长度。比如,可以使用len1 = vec.size()来获取vec的长度,使用len2 = vec[i].size()来获取第i个vector容器的长度。 遍历输出vector<vector<int>>的每个元素时,可以使用迭代器来访问。比如,可以使用嵌套的迭代器来遍历vec中的每个元素,并使用*it来访问其中的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vector内的vector的用法](https://blog.csdn.net/TenAndSeven/article/details/104155375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [学习C++STLvector嵌套vector](https://blog.csdn.net/qq_44643644/article/details/104801287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值