C++ vector类成员函数介绍

目录


🤔vector模板介绍:

          📖vector模板C++标准库中的一个容器类,被设计为动态数组,即它可以根据需要自动分配内存空间来存储元素。vector模板的本质是一个类模板,它使用了C++语言中的模板技术,使其能够适应不同的数据类型,提供了一种通用的容器类实现。
          📖具体而言,vector类使用连续的内存来存储元素,它提供了访问和操作元素的方法,如push_back()、pop_back()、at()、[]等,同时还提供了一些其他的方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。在实际编程中,vector模板可以作为一种通用的容器使用,可以方便地存储和管理各种类型的数据。

🤔特点:

📖1.动态扩容:vector模板可以动态地扩充容器大小,当容器中元素数量增加时,vector会自动分配更多的内存空间来存储元素。这样可以避免手动分配内存空间带来的麻烦和错误。

📖2.随机访问:vector中的元素是连续存储的,因此,可以通过下标的方式(使用[]操作符)来访问任何一个元素。这使得vector可以高效地进行随机访问。

📖3.内存管理:vector会自动管理内存,当元素被删除或者容器的大小被缩小时,vector会自动回收不再需要的内存。这种管理方式可以避免内存泄漏问题。

📖4.插入和删除元素:vector提供了多种插入和删除元素的方法,如push_back()  pop_back()、erase()等。这些方法可以方便地操作容器中的元素。

📖5.大小变化:vector中的元素数量可以随时变化,因此可以方便地进行动态管理。同时,vector还提供了一些方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。

🤔vector的成员函数:

🔍vector构造函数:

📖1.采用模板实现类实现,默认构造函数:vector <T> v;

vector<类型>名称;

📖2.将v[begin(),end())区间中的元素拷贝给自身:vector<v.begin(),v.end()>;

vector<int>v1;
vector<int>v2(v1.begin(), v1.end());

📖3.将n个elem元素拷贝给自身:vector(n,elem);

vector<int>v3 (n, elem);

📖4.将另外一个vector类对象拷贝给自身:vector(const vector &vec);

	vector<int> v4(v3);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "";
	}
}
void test01()
{	//默认构造  无参构造
	vector<int>v1;
	for (int i = 0; i < 9; i++)
	{
		v1.push_back(i);
	}
	cout << "默认构造:";
	printv(v1);
	cout << endl;


	//区间拷贝构造
	vector<int>v2(v1.begin(), v1.end());
	cout << "区间拷贝构造:";
	printv(v2);
	cout << endl;


	//n个elem构造
	vector<int>v3 (10, 8);
	cout << "n个elem构造:";
	printv(v3);
	cout << endl;

	//拷贝构造
	vector<int> v4(v3);
	cout << "拷贝构造:";
	printv(v4);
	cout << endl;

}
int main()
{
	test01();
}

📖运行结果:


 

 🔍vector赋值函数

📖1.将n个elem拷贝赋值给本身:assign(n,elem);

vector<int>v1;
v1.assign(n, elem);

📖2.将[beg,end)区间中的数据拷贝赋值给本身:assign(begin,end);

vector<int>v2;
v2.assign(v1.begin(), v1.end());

📖3.重载等号运算符:vector &operator =(const vector &vec)

vector<int>v3=v2;

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{	//将n个elem拷贝赋值给本身
	vector<int>v1;
	v1.assign(10, 8);
	cout << "将n个elem拷贝赋值给本身";
	printv(v1);
	
	//将[beg,end)区中的数据拷贝复制给自己
	vector<int>v2;
	v2.assign(v1.begin(), v1.end());
	cout << "将[beg,end)区中的数据拷贝复制给自己";
	printv(v2);

	//重载等号赋值运算符
	vector<int>v3=v2;
	cout << "重载等号赋值运算符";
	printv(v3);

}
int main()
{
	test01();
}

📖运行结果:

 🔍vector容器的判断函数

📖1.判断容器是否为空:empty();

📖2.容器的容量:capacity();

📖3.返回容器中元素的个数:size();

📖4.重新指定容器的长度,如果容器变长,就以默认值填充,如果容器变短,则末尾超过容器长度的元素被删除:resize(int num);

📖5.重新指定容器的长度为num,如果容器的长度变长,就以elem值填充新位置,如果容器变短,则末尾超出容器长度元素被删除:resize(int num,elem);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
		cout << endl;
}
void test01()
{
	
	vector<int>v1;
	v1.assign(8, 4);
	printv(v1);
	
	cout <<"该容器是否为空? " << v1.empty() << endl; //1为空,0为不空
	cout <<"该容器的容量是" << v1.capacity() << endl;
	cout <<"该容器中的元素个数是: " << v1.size() << endl;
	v1.resize(12);
	printv(v1);
	
	v1.resize(14, 8);
	printv(v1);

}
int main()
{
	test01();
}

📖运行结果:

resize函数的重点内容:

📖1.编译器扩容会比你要求扩容的,例如你写resize(2000),编译器实际可能扩到2300。

📖2.resize函数的缩放机制不一样❌,如下:

 

📖 代码验证:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test02()
{
	vector <int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	v.resize(4);
	
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" << v.size() << endl;
	v.resize(200000);
	cout << "v.resize(200000)后v的容量为:" << v.capacity() << endl;;
	cout << "v.resize(200000)后v的大小为:" << v.size() << endl;
	v.resize(4);
	cout << "v.resize(4)后v的容量为:" << v.capacity() << endl;;
	cout << "v.resize(4)后v的大小为:" << v.size() << endl;

}
int main()
{
	test02();
}

📖运行结果:

🔍 vector的删除和插入

📖1.对容器尾部元素进行插入:push_back();

📖2.删除最后一个 元素:pop_back();

📖3.从pos位置删除元素elem:insert(const_iterator pos,elem);

📖4.从pos位置上插入count个elem:insert(const _interator pos,int count,ele);

📖5.删除迭代器指向的元素:erase(const_iterator pos);

📖6.删除迭代器从start到end的所有元素:earse(const_iterator start,const_iterator end);

📖7.删除容器中所有元素:clear();

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector<int>v1(10, 8);
	printv(v1);

	//向末尾插入一个元素9
	v1.push_back(9);
	cout << "插入元素后:";
	printv(v1);

	//删除末尾元素	
	v1.pop_back();
	cout << "删除元素后:";
	printv(v1);

	//在开头的位置插入元素1
	v1.insert(v1.begin(), 1);
	cout << "开头插入元素后:";
	printv(v1);

	//在末尾的位置插入5个6
	v1.insert(v1.begin(), 5, 6);
	cout << "末尾插入元素后:";
	printv(v1);

	//删除开头的第一个元素
	v1.erase(v1.begin());
	cout << "删除开头元素后:";
	printv(v1);

	//删除区间内的所有元素
	v1.erase(v1.begin(), v1.end());
	cout << "删除指定区间元素后:";
	printv(v1);

	//先赋值再清空a
	vector<int>v2(10, 8);
	v1.clear();
	cout << "清空容器元素后:";
	printv(v1);
}

📖运行结果:

🔍 vector数据存取功能:

📖1.取出第idx+1个元素 :at(int idx);

📖2.取出第idx+1个元素:operator[];

📖3.取出容器中第一个元素:front();

📖4.取出容器中最后一个元素:back();

📖元素下标是从0开始的。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	printv(v1);
	cout <<"第三个元素为:" << v1.at(2) << endl;
	cout <<"第四个元素为" << v1[3] << endl;
	cout <<"第一个元素为" << v1.front() << endl;
	cout <<"最后一个元素为" << v1.back() << endl;

}

📖运行结果:

🔍vector互换容器

📖1.将另一个容器与自身进行交换:swap(vec);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	cout << "互换前:" << endl;
	vector<int>v1(10, 8);
	printv(v1);

	vector<int>v2(10, 6);
	printv(v2);

	cout << "互换后:" << endl;
	v1.swap(v2);
	printv(v1);
	printv(v2);
}

swap 实际用途:

📖在上面我们已经讲过resize在缩小容器的时候,只能缩小容器的实际使用大小,而不能修改他的容量,这样就会造成大量的内存浪费,而swap函数就提供了一种解决方法:
 代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1(10, 8);
	printv(v1);

	vector<int>v2(10, 6);
	printv(v2);

	v1.swap(v2);
	printv(v1);
	printv(v2);
}
void test02()
{
	vector <int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	v.resize(4);
	
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" << v.size() << endl;
	

	
	cout << "巧用swap收缩内存";
	
	v.resize(4);
	vector<int>(v).swap(v);
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" <<   v.size()   << endl;
}
int main()
{

	test02();
}

📖运行结果:

📖 我们来详细讲解一下原理:
📖先看缩小时用到的代码:

vector<int>(v).swap(v);

📖这串代码实际上是利用拷贝构造,创建了一个匿名对象,将v拷贝给这个匿名对象,此时匿名对象的容量使用大小都等于v实际使用大小,再在让这个匿名对象使用内置swap函数实现容量的转换。

📖图示:

 

🤔结束!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月20日
下一篇 2023年12月20日

相关推荐