C++的vector容器

版权声明:本博客为博主原创文章,未经博主允许,禁止转载,谢谢合作。 https://blog.csdn.net/weixin_43971252/article/details/88256840

注: 文章为本人为方便复习而写,若有朋友要参考,本文的不清楚的地方可以留言,也可以参考其他网页。

#include<iostream>
#include<vector>
#include<list>
using namespace std;

//容量与实际数据量
void test_one()
{
	vector<int> v;

	for (int i(0); i < 15; i++)
	{
		v.push_back(i);
		cout << v.capacity() << endl;
	}
	cout <<"\n" << v.size() << endl;
	//vector为类似动态数组,其容量的分配增长速度不是一个确定值,容量 >= 实际元素个数
}

void printVector(vector<int> v)
{
	
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << "\n";
}

//初始化和赋值
void test_two() {
	//初始化
	vector<int> v1{ 10,2,56,90,1000 };
	printVector(v1);

	vector<int> v2(v1.begin(), v1.end()); //把v1.begin()到v1.end()之间的数据拷贝给v2
	printVector(v2);

	int arr[5]{ 1,2,3,4,5 };
	vector<int> v3(arr, arr + sizeof(arr) / sizeof(int));   //功能类似于上一个
	printVector(v3);

	vector<int> v4(10, 666); //(n,elem), 将n个elem拷贝给v4
	printVector(v4);
	//以上调用构造函数初始化

	vector<int> v5(v4);    //调用拷贝构造函数把v4拷贝给v5
	printVector(v5);

	//赋值
	//1.使用assign会删除容器之前的数据,重写
	vector<int> v6;
	v6.assign(v1.begin(), v1.end());  //将区间:v1.begin()到v1.end()的数据赋值给v6
	printVector(v6);                //数据和v1一样
	v6.assign(3, 10000);            //将删除v6之前的数据,并将n个(3) val(10000)重新写入到v6
	printVector(v6);

	//2.重载=
	vector<int> v7 = v6;
	printVector(v7);

	//3.swap交换数据
	v7.swap(v1);      //交换当前vector容器对象v7与v1的数据
	printVector(v7);   
}

//vector空间大小操作
void test_three()
{
	vector<int> v{ 1,2,3,4,5,6 };

	printVector(v);
	cout << "size : " << v.size() << endl;         //返回对象v有多少个有效数据
	cout << "capacity : " << v.capacity() << endl;  
	if (v.empty())
		cout << "v为空" << endl;
	else 
		cout << "v非空" << endl;

	//resize重新指定容器的长度
	//1.v.resize(n),重新指定长度为n,若容器变长,则以默认值(一般为0)填充新位置,若容器变短,则末尾超出长度的元素被删除
	v.resize(3);
	printVector(v);
	v.resize(10);
	printVector(v);

	//2.v.resize(n,elem),若容器变长,则用elem填充新位置,若容器变短,末尾超出指定的长度的元素被删除
	v.resize(7, 6);     //容器变短不重写: 1 2 3 0 0 0 0
	printVector(v);
	v.resize(10, 6);
	printVector(v);
}

//注:数据量很大时可以用reserve预留出空间,避免多次开辟空间
//用swap收缩容器对象空间
void test_swap()
{
	vector<int> v;

	for (int i(0); i < 1000; i++)
		v.push_back(i);
	cout << "capacity of v : " << v.capacity() << endl;
	cout << "size of v : " << v.size() << endl;

	v.resize(10);   
	cout << "capacity of v : " << v.capacity() << endl;  //没有变化
	cout << "size of v : " << v.size() << endl;         //变为10
	
	//匿名对象的空间为10,使用swap交换了v与匿名对象的空间,实现将对象v的空间收缩
	vector<int>(v).swap(v);
	cout << "capacity of v : " << v.capacity() << endl;  //变为10
	cout << "size of v : " << v.size() << endl;         //10
}

//读取数据
void test_four(){
	vector<int> v;

	v.push_back(100);
	v.push_back(200);
	v.push_back(300);
	v.push_back(400);
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		cout << *it << "  ";
	cout << endl;
	cout << "第二个数据 : " << v[1] << endl;
	cout << "第三个数据 : " << v.at(2) << endl;   //使用at越界时会抛出异常,更安全
	cout << "第一个数据 : " << v.front() << endl;
	cout << "最后一个数据 : " << v.back() << endl;

	//vector容器的迭代器支持随机访问
	vector<int>::iterator itBegin = v.begin();
	itBegin = itBegin + 1;                   //这样写不报错就表明该容器支持随机访问               
	itBegin += 2;

	list<int> l{ 10,30,49,90 };
	list<int>::iterator litBegin = l.begin();
	//litBegin = litBegin + 1;    //error 因为链表容器没有重载迭代器加法操作
}

//插入和删除
void test_five()
{
	vector<int> v;

	v.push_back(10);
	v.push_back(20);

	//insert( , , ):第一个参数是要插入的位置(一个迭代器值),第二个参数为插入的数据的个数,第三个参数为插入数据的值
	v.insert(v.begin(), 66);     //在迭代器起始位置可以实现前插
	printVector(v);
	v.insert(v.begin() + 1, 2, 888);
	printVector(v);

	v.pop_back();         //删除vector容器对象里的最后一个元素
	printVector(v);

	//erase删除指定位置(迭代器值即指针)或者指定区间[first,last)的数据,不包括last
	v.erase(v.begin());
	printVector(v);
	v.erase(v.begin(), v.begin() + 1);   //等价于v.erase(v.begin());
	printVector(v);

	//清除所有数据
	v.clear();
	if (v.empty())
		cout << "v已经清空" << endl;
}

//逆序遍历
void reverseprint() {
	vector<int> v{ 1,2,3,4,5,6 };

	//使用逆序迭代器:reverse_iterator
	for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
		cout << *rit << "  ";
	cout << "\n";
}

int main()
{
	//test_one();
	//test_two();
	//test_three();
	//test_swap();
	//test_four();
	//test_five();
	reverseprint();

	cin.get();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43971252/article/details/88256840