vector之一(常见接口代码分析)

本文详细介绍了C++标准库中的vector容器,包括其构造函数、迭代器使用、容量管理、元素访问和修改方法。通过实例展示了如何进行元素的插入、删除、查找和修改,以及resize和reserve等操作。同时,对比了不同编译环境下vector的扩容策略。内容涵盖vector的基本操作和高级用法,适合C++初学者和进阶者阅读。
摘要由CSDN通过智能技术生成

1 vector介绍

vector是表示可变大小数组的容器。
vector比较像数组,采用连续存储空间来存储元素。可以采用下标对vector元素进行访问,和数组一样。但是,不一样在于,vector的大小是可以动态改变的,而且vector的大小会被容器自动处理。

2 vector常见接口

2.1 构造函数

在这里插入图片描述
代码参考:

vector<int> v1; //空vector 
vector<int> v2(10, 2); //10个空间,存2
vector<int>v3(v2.begin(), v2.end());
vector<int> copy(v1); //拷贝构造

2.2 vector iterator

vector维护的是一个连续线性空间,所以不论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要条件,因为vector迭代器所需要的操作operator* 等操作普通指针天生就有。

下图表示常用的迭代器:
在这里插入图片描述
这里用迭代器实现遍历:(实现功能:正向迭代器,迭代器修改值,反向迭代器)。

在这里插入图片描述

void TestVector()
{
	vector<int> v1; //空vector 
	vector<int> v2(10, 2); //10个空间,存2
	vector<int> copy(v1); //拷贝构造
	vector<int>v3(v2.begin(), v2.end());

	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

	//vector遍历方式 迭代器
	vector<int>::iterator it1 = v1.begin();
	while (it1 != v1.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;

	// 迭代器中 值的修改
	it1 = v1.begin();
	while (it1 != v1.end())
	{
		*it1 *= 2;
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;

	//反向迭代器
	vector<int>::reverse_iterator rit = v1.rbegin();
	while (rit != v1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
}

2.3 容量空间

在这里插入图片描述
size、empty、capacity:
在这里插入图片描述

重点分析:capacity的增容问题?
在vs中运行时,增容方式:
看图可知在vs中的增容方式为1.5倍增容。
在这里插入图片描述
在linux环境下,g++运行结果为:
分析可知,在g++环境下capacity扩容方式为2倍扩容。
在这里插入图片描述
reserve:
改变vector放入capacity。
如果n大于当前vector容量,该函数将使容器重新分配其存储,并将其容量增加到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,vector容量也不会受到影响。此函数对vector大小没有影响,并且不能更改其元素。
在这里插入图片描述
resize:
调整容器大小,使其包含n个元素。

  • 如果n小于当前容器大小,则内容将减少到其前n个元素,并删除超出的元素(并销毁它们)。
  • 如果n大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则新元素将初始化为val的副本,否则,它们将被值初始化。
  • 如果n也大于当前容器容量,则会自动重新分配分配的存储空间。请注意,此函数通过插入或删除容器中的元素来更改容器的实际内容。

在这里插入图片描述
shrink_to_fit:
请求容器减小其容量以适应其大小。这可能会导致重新分配,但对vector的size没有影响,并且不能改变其元素。
在这里插入图片描述

2.4 元素获取

在这里插入图片描述
分析:
front、back:返回对vector中第一个元素的引用,该函数返回直接引用;
data 操作时返回一个直接指针,指向内部用于存储其所属元素的内存数组。后面++p,p[2]等操作都是以指针为基础的操作。
测试代码:

//验证 元素获取
void TestElement()
{
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v2.push_back(i);
	}

	for (int i = 0; i < v2.size(); ++i)
	{
		cout << v2[i]<<" ";
	}
	cout << endl;

	for (int i = 0; i < v2.size(); ++i)
	{
		cout << " " << v2.at(i);
	}
	cout << endl;

	vector<int> v3;
	v3.push_back(9);
	v3.push_back(20);

	v3.front() += v3.back();
	cout << v3.front() << endl;

	vector<int> v4(5);
	int *p = v4.data();
	*p = 10;
	++p;
	*p = 20;
	p[1] = 30;

	for (int i = 0; i < v4.size(); ++i)
	{
		cout << v4[i] << " ";
	}
	cout << endl;
}

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

2.5 修改(增删查改)

下面是vector中的元素修改模块,其含义在下面给出:
在这里插入图片描述

  • push_back :尾插
  • pop_back:尾删
  • insert:在pos位置之前插入val值
  • erase:删除pos位置数据
  • swap:交换两个vector的数据空间

代码测试:
insert测试代码
insert插入有三种方式,下面代码给出详细解释。

//insert 
/*
single element (1)
iterator insert (iterator position, const value_type& val);
fill (2)
void insert (iterator position, size_type n, const value_type& val);
range (3)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
*/
void TestInsert()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	v.push_back(6);

	//头插 0
	v.insert(v.begin(), 0);
	PrintVector(v);

	v.erase(v.begin());
	PrintVector(v);

	std::vector<int> v1{ 1,2,3,4,5,6 };
	std::vector<int>::iterator pos1 = find (v1.begin(), v1.end(), 3);
	if (pos1 != v1.end())
	{
		v1.insert(pos1, 30);
	}
	PrintVector(v1);

	std::vector<int>::iterator pos2 = find(v1.begin(), v1.end(), 5);
	if (pos2 != v1.end())
	{
		v1.insert(pos2, 3, 30);
	}
	PrintVector(v1);

	vector<int> v2(3, 6);
	v1.insert(v1.begin() + 1, v2.begin(), v2.end());
	PrintVector(v1);
}

测试结果:
在这里插入图片描述

增删查改测试:

//测试修改 增删查改
void TestModifiers()
{
	cout << "=========== assgin 测试============" << endl;
	std::vector<int> first;
	std::vector<int> second;
	std::vector<int> third;

	first.assign(7, 100);             // 7 ints with a value of 100
	PrintVector(first);

	std::vector<int>::iterator it;
	it = first.begin() + 1;

	second.assign(it, first.end() - 1); // the 5 central values of first
	PrintVector(second);

	int myints[] = { 17, 7, 4 };
	third.assign(myints, myints + 3);   // assigning from array.
	PrintVector(third);

	cout << "=========== push_back 测试============" << endl;
	vector<int> v1;
	for (int i = 0; i < 10; ++i)
	{
		v1.push_back(i);
	}
	PrintVector(v1);

	cout << "=========== pop_back 测试============" << endl;
	if (!v1.empty())
	{
		v1.pop_back();
	}
	PrintVector(v1);

	cout << "=========== erase 测试============" << endl;
	/*
	iterator erase (iterator position);
	iterator erase (iterator first, iterator last);
	*/
	v1.erase(v1.begin() + 2);
	PrintVector(v1);

	v1.erase(v1.begin(), v1.begin() + 2);
	PrintVector(v1);

	cout << "=========== empty 测试============" << endl;
	v1.clear();
	if (v1.empty() == 1)
	{
		cout << "v1 空" << endl;
	}

	cout << "=========== swap 测试============" << endl;
	vector<int> foo(3, 100);   // three ints with a value of 100
	vector<int> bar(5, 200);   // five ints with a value of 200
	PrintVector(foo);
	PrintVector(bar);
	foo.swap(bar);
	PrintVector(foo);
	PrintVector(bar);

	cout << "=========== emplace 测试============" << endl;
	vector<int> v3 = { 1, 2, 3, 4, 5 };
	auto it1 = v3.emplace(v3.begin() + 2, 100);
	v3.emplace(it1, 200);
	v3.emplace(v3.end(), 300);
	PrintVector(v3);
}

测试结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值