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

Posted yumoz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vector之一(常见接口代码分析)相关的知识,希望对你有一定的参考价值。

文章目录

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);

测试结果:

以上是关于vector之一(常见接口代码分析)的主要内容,如果未能解决你的问题,请参考以下文章

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

List接口

C++初阶第十篇——vector(vector常见接口的用法与介绍+vector的模拟实现)

vector你得知道的知识

vector使用+模拟实现

[C/C++ -STL]vector底层实现机制刨析