vector容器(学习笔记)

  • 功能:vector数据结构和数组非常相似,也称为单端数组
  • 区别:数组是静态空间,vector可以动态扩展

1.构造函数

  • 动态扩展:并不是在原空间后续接新空间,而是找一个更大的内存空间,然后将原数据拷贝到新空间,再释放原空间。vector容器的迭代器是支持随机访问的迭代器
  • vector构造函数:

功能:创建一个vector容器

  • 函数原型:

vector<T> v;//采取模板实现类实现,默认构造函数

vector<v.begin().v.end());//将[v.begin().v.end())区间的元素拷贝给本身

vector(n,elem);//构造函数将n个elme拷贝给本身

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

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
	//无参构造 //采取模板实现类实现,默认构造函数
	
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//将[v.begin().v.end())区间的元素拷贝给本身
	vector<int>v2(v1.begin(), v1.end());
	printVector(v2);

	//构造函数将n个elme拷贝给本身
	vector<int>v3 (10, 100);
	printVector(v3);

	//***拷贝构造函数
	vector<int>v4(v3);
	printVector(v4);
}
void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}
int main()
{
	test01();
	
	system("pause");
	return 0;

}

2.赋值操作

  • 功能:给vector容器进行赋值
  • 函数原型:

vector&operator=(const vector&v);//重载等会操作
assign(beg,end);//将[beg,end)区间的数据拷贝赋值给本身
assign(n,ellem);//将n个elem拷贝赋值给本身
 

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//赋值
	vector<int>v2;
	v2 = v1;
	printVector(v2);

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

	vector<int>v4;
	v4.assign(10, 100);
	printVector(v4);

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

}
int main()
{
	test01();
	
	system("pause");
	return 0;

}

3.vector容器的容量和大小

  • 功能:给vector容器的容量和大小操作
  • 函数原型:

empty();//判断容器是否为空
capacity();//容器的容量
size();//返回容器中元素个数
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置**若容器变短。则末尾超出容器长度的元素被删除
resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置**若容器变短。则末尾超出容器长度的元素被删除

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);//0 1 2 3 4 5 6 7 8 9

	if (v1.empty())
	{
		cout << "该容器为空" << endl;
	}
	else
	{
		cout << "该容器不为空" << endl;
		cout << "该容器的容量为:" << v1.capacity() << endl;//13 因为是动态扩展
		cout << "该容器的大小为:" <<v1.size()<< endl;//10
	}
	//重新指定大小
	//v1.resize(15);//指定长了,默认值为0  输出:0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
	//printVector(v1);

	//v1.resize(15,3);//指定长了,重新设置默认值为3  输出:0 1 2 3 4 5 6 7 8 9 3 3 3 3 3
	//printVector(v1);

	v1.resize(5);
	printVector(v1);//比原来小了,超出的就删掉
}
void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}
int main()
{
	test01();
	
	system("pause");
	return 0;

}

4.插入和删除

  • 功能:对vector容器进行插入和删除
  • 函数原型:

push_back(ele);//在尾部插入元素ele
pop_back();//删除最后一个元素
insert(const_iterator pos,ele);//迭代器指向位置pos擦汗如元素ele
insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);//删除迭代器指向的元素
erase(const_iterator start,const_iterator end);//迭代器删除从start到end之间的元素
clear();//删除容器所以元素

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
	vector<int>v;
	//尾插
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	printVector(v);
	//尾删
	v.pop_back();
	printVector(v);
	//insert(const_iterator pos,ele);//迭代器指向位置pos插入元素ele
	v.insert(v.begin() + 1, 99);
	printVector(v);
	//insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele
	v.insert(v.begin() + 1,2, 99);
	printVector(v);
	//erase(const_iterator pos);//删除迭代器指向的元素
	v.erase(v.begin());
	printVector(v);
	//erase(const_iterator start, const_iterator end);//迭代器删除从start到end之间的元素
	v.erase(v.begin()+1,v.begin()+5);//删除 第一个元素之后到第五个元素
	printVector(v);
	//clear();//删除容器所以元素
	v.clear();
	printVector(v);
}
void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}
int main()
{
	test01();
	
	system("pause");
	return 0;

}

5.数据存取

  • 功能:对vector容器中的数据的存取操作
  • 函数原型:

at(int idx);//返回索引idx的所指的数据
operator[];//返回索引idx的所指的数据
front();//返回容器的第一个数据元素
back();//返回容器中最后一个数据元素

#include<iostream>
using namespace std;
#include<vector>
void test01()
{
	vector<int>v;
	for(int i=0;i<10;i++)
	{
		v.push_back(i);
	}
	//at(int idx);//返回索引idx的所指的数据
	for (int i = 0; i < v.size(); i++)
	{
		cout << v.at(i) << " ";
	}cout << endl;
	//operator[];//返回索引idx的所指的数据
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}cout << endl;
	//front();//返回容器的第一个数据元素
	cout << "容器的第一个数据元素" << v.front() << endl;
	//back();//返回容器中最后一个数据元素
	cout << "容器中最后一个数据元素" << v.back() << endl;
}
int main()
{
	test01();
	
	system("pause");
	return 0;

}

6.互换容器

  • 功能:实现两个容器内元素进行互换
  • 函数原型:

swap(v);//将v与本身的元素互换

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//基本使用
void test01()
{
	vector<int>v1;
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	vector<int>v2;
	for (int i = 10; i>0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);
	cout << "交换后的元素:"  << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}
//实际用途
//利用swap可以收缩内存空间
void test02()
{
	vector<int>v1;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
	}
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的大小为:" << v1.size() << endl;
	//容量会比大小多

	//重新指定大小
	v1.resize(3);
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的大小为:" << v1.size() << endl;

	//利用swap可以收缩内存空间
	vector<int>(v1).swap(v1);
	//vector<int>(v1)--同名的匿名对象{指向的是3个大小元素}和v1交换元素;
    //匿名对象指向100000个大小的元素,匿名对象特点:当前行执行完后,编译器回收
	cout << "v1的容量为:" << v1.capacity() << endl;
	cout << "v1的大小为:" << v1.size() << endl;
}
int main()
{
	//test01();
	test02();
	system("pause");
	return 0;

}

7.预留空间

  • 功能:减少vector在动态扩展时的扩展次数
  • 函数原型:

reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问;和resize不同

#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//预留空间
void test02()
{
	vector<int>v1;
	v1.reserve(100000);
	int num = 0;//统计开辟次数

	int* p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);

		if (p != &v1[0])
		{
			p = &v1[0];
			num++;
		}//如果需要开辟新的空间,那么就需要指针指向首地址
	}//使用reserve函数可以直接一次确定所需要的空间
	cout << "开辟次数=" << num << endl;	
}
int main()
{
	test02();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值