C++ STL进阶与补充(vector容器)

Vector又称为单端数组,与数组不同的是,vector可以动态扩展。

动态扩展并不是在原有空间中续接新空间,而是寻找更大的空间,然后将原数据拷贝到新空间,释放原空间。

C++ STL进阶与补充(vector容器)_第1张图片

1、vector构造函数

Vector v; //采用模板实现,默认构造函数

Vector(v.begin(),v.end()); //将v[gegin(),end()]区间中的元素拷贝给本身

Vector(n,elem); //将n个elem拷贝给本身

Vector(const vector& vec); //拷贝构造函数

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

	//通过区间方式构造
	vectorv2(v1.begin(), v1.end());
	printVector(v2);

	//n个elem的构造
	vector v3(10, 100);
	printVector(v3);

	//拷贝构造
	vector v4(v3);
	printVector(v4);
}
int main()
{
	test01();
	
}

2、vector赋值操作

功能:为vector容器进行赋值

可以用“=”号进行赋值,也可使用函数assign赋值。

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

	//等号赋值
	vector v2;
	v2 = v1;
	printVector(v2);

	//assign方式
	vector v3;
	v3.assign(v1.begin(),v1.end());
	printVector(v3);
}
int main()
{
	test01();
	
}

3、vector容量和大小

Empty()

判断容器是否为空

Capacity()

容器的容量

Size()

返回容器中元素的个数

Resize(int num)

重新制定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。

Resize(int num, elem)

重新制定容器的长度为num,若容器变长,则以elem填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。

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

	//判断是否为空
	if (v1.empty())
	{
		cout << "v1 为空!" << endl;
	}
	else
	{
		cout << "v1 不为空!" << endl;
		cout << "v1的容量为多少" << v1.capacity() << endl; //将输出13
		cout << "v1的大小为多少" << v1.size() << endl; //将输出10
	}

	//重新指定大小
	v1.resize(15);
	printVector(v1);  //将在后面添加5个默认值,默认值为0

	v1.resize(5);
	printVector(v1); //如果重新制定的短了,超出部分会被删掉
}
int main()
{
	test01();
}

4、vector插入和删除

Push_back(elem)

尾部插入元素elem

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)

删除迭代器从strat到end之间的所有元素

Clear()

删除容器中所有元素

#include
#include
using namespace std;
void printVector(vector& v)
{
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector v1; 
	v1.push_back(10);  //尾插法插入数据
	v1.push_back(20);  
	v1.push_back(30);  
	v1.push_back(40);  
	//遍历
	printVector(v1);

	//删除尾部元素
	v1.pop_back();
	printVector(v1);

	//插入,第一个参数是迭代器
	v1.insert(v1.begin(), 100);
	printVector(v1);
	//插入多个数据
	v1.insert(v1.begin(), 2,1000);
	printVector(v1);

	//删除特定位置的元素
	v1.erase(v1.begin());
	printVector(v1);
	//删除区间的元素
	v1.erase(v1.begin()+1,v1.end()-2);
	printVector(v1);
}
int main()
{
	test01();
}

5、vector数据存取

At(int idx)

通过索引idx指向数据

operator[]

[]返回,和数组一样

Front

返回容器中第一个数据元素

Back

返回容器中最后一个数据元素

6、vector互换容器

功能:实现两个容器内的元素交换。

实际用途:巧用swap可以收缩内存空间

#include
#include
using namespace std;
void printVector(vector& v)
{
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector v1; 
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	cout << "交换前:" << endl;
	printVector(v1);
	vector v2;
	for (int i = 10; i >0; i--)
	{
		v2.push_back(i);
	}	
	printVector(v2);
	cout << "交换后:" << endl;
	v1.swap(v2); //进行交换
	printVector(v1);
	printVector(v2);
}
void test02() //利用swap收缩内存空间
{
	vector v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
	}
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;

	v.resize(3);
	cout << "v的容量:" << v.capacity() << endl;  //容量不会变成3
	cout << "v的大小:" << v.size() << endl;  //大小会变成3
	//利用swap收缩内存
	vector(v).swap(v); //先创建一个匿名对象,然后与之交换
	//匿名对象在该行执行完之后将被系统自动回收
	cout << "v的容量:" << v.capacity() << endl; 
	cout << "v的大小:" << v.size() << endl;  
}
int main()
{
	//test01();
	test02();
}

7、vector预留空间

功能:减少vector在动态扩展容量时的扩展次数。预留位置不会初始化,元素不可访问。

#include
#include
using namespace std;
void printVector(vector& v)
{
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector v; 
	v.reserve(10000); //上来直接分很长的空间,如果不预留,num会等于24

	int num = 0; //统计内存开辟次数
	int* p = NULL;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << num << endl;
}

int main()
{
	test01();
}

你可能感兴趣的:(C++,STL,c++,大数据,开发语言)