#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<functional>
#include<ctime>

using namespace std;

void fun(int i)
{
	cout << i;
}

void Constructor_vector()//vector构造

{
	vector<int> vec(5);
		for (int i = 0;i < vec.size();i++)
		{
			cout << vec[i];
		}
		cout <<" 1.用n个零为对象初始化"<< endl;

	vector<int> vec1(5, 6);
		for (int i = 0;i < vec1.size();i++)
		{
			cout << vec1[i];
		}
		cout << " 2.用n个val为对象初始化" << endl;


	vector<int> vec2(vec1);
		for (int i = 0;i < vec2.size();i++)
		{
			cout << vec2[i];
		}

		cout << " 3.拷贝构造(必须类型相同)" << endl;

}

void Attribute_vector()//vector属性
{

	vector<int> vec(7);
	cout << vec.capacity() << " 1.vector容量问题"<<endl;
	//结论:vector的初始容量和对象初始化的元素个数相同。
	//容量不够时, 增加现有容量的一半(vs);容量不够时, 增加原有大小(vc)。




	vector<int> vec1(10);
	vec1.reserve(15);//变大规律为参数传递多少就是多少,前提是只能改大。
	cout << vec1.capacity() <<" 2.vector修改容量"<< endl;



	vector<int> vec2(4);
	vec2.resize(3);//n<=原来元素个数,容量不变,否则会改变,变大规律是原来空间的1.5倍。
	cout << vec2.size() << " " << vec2.capacity()<<" 3.重新设置元素个数"<<endl;



	vector<int> vec3(3);
	cout << vec3.size() << " 4.输出元素有效个数" << endl;

}

void Output_vector()//vector输出
{

	vector<int> vec;
	for (int i = 0;i < 10;i++)
	{
		vec.push_back(i);//为对象赋值0~9
	}
	for (int i = 0;i < vec.size();i++)
	{
		cout << vec[i];//[]下标输出
	}
	cout <<" 1.下标输出"<< endl;

	cout << vec.at(3)/*vec[3]*/ << " 2.at()输出"<<endl;
	//由于.at()函数越界会抛出异常,[]下标运算越界崩溃。所以at()比[]下标运算更安全

}

void Construction_vector_iterator()//vector迭代器_构造
{
	//迭代器构造
	vector<int>vec(5, 6);
	vector<int>::iterator ite = vec.begin();
	for (int i = 0;i < vec.size();i++)
	{
		cout << *ite;
	}
	cout << " 迭代器构造"<<endl;
}

void output_vector_iterator()//string迭代器_输出
{
	vector<int> vec;
	for (int i = 0;i < 5;i++)
	{
		vec.push_back(i);
	}


	vector<int>::iterator ite = vec.begin();
	for (ite;ite != vec.end();ite++)
	{
		cout << *ite;
	}
	cout <<" 1.迭代器输出"<< endl;


	//此函数需要加头文件 #include<algorithm>
	for_each(vec.begin(), vec.end(), fun);
	cout <<" 2.for_each()函数"<< endl;

	cout << vec.back() << " 3.输出尾巴" << endl;

}

void Add_vector()//vector增加
{
	//对于数组来说, 尾添加效率最高, 中间插入效率很低。✔


	vector<int> vec;
	cout << " 1.vec.push_back(val);//为最后一个元素赋值"<<endl;


	vector<int> vec1;
	for (int i = 0;i < 10;i++)
	{
		vec1.push_back(i);
	}

	
	vec1.insert(vec1.begin() + 2, 99);
	for_each(vec1.begin(), vec1.end(), fun);
	cout <<" 2.增加一个val"<< endl;

	vector<int> vec2;
	for (int i = 0;i < 10;i++)
	{
		vec2.push_back(i);
	}

	vec2.insert(vec2.begin() + 2, 2, 66);
	for_each(vec2.begin(), vec2.end(), fun);
	cout << " 3.增加n个val"<<endl;


	vector<int> vec3;
	vector<int> vec4;
	for (int i = 0;i < 10;i++)
	{
		vec3.push_back(i);
	}
	for (int i = 0;i < 10;i++)
	{
		vec4.push_back(i);
	}

	vec3.insert(vec3.begin(), vec4.begin()+3, vec4.begin() + 4);
	for_each(vec3.begin(), vec3.end(), fun);
	cout << " 4.添加另一个对象的一段"<<endl;

}

void Delete_vector()//vector删除
{
	vector<int> vec(5, 6);

	vec.pop_back();
	for_each(vec.begin(), vec.end(), fun);
	cout << " 1.尾删除"<<endl;	//每调用一次删除一个最后的元素。

	vector<int> vec1(3, 7);
	vec1.erase(vec1.begin() + 2);//删除第二个元素
	for_each(vec1.begin(), vec1.end(), fun);
	cout << " 2.删除指定元素"<<endl;

	vector<int>vec2(6, 3);
	vec2.erase(vec2.begin() + 3, vec2.end());
	for_each(vec2.begin(), vec2.end(), fun);
	cout << " 3.删除一段"<<endl;

	vec2.clear();
	for_each(vec2.begin(), vec2.end(), fun);
	cout <<" 4.清空所有"<<endl;

}

void Other_vector()//vector其他函数
{
	vector<int> vec;
	cout << vec.empty() << " 1.判空" << endl;


	vector<int>vec1(2, 3);
	vector<int>vec2(2, 4);
	vec1.swap(vec2);
	vector<int>::iterator ite = vec1.begin();
	vector<int>::iterator ite2 = vec2.begin();
	for_each(vec1.begin(), vec1.end(), fun);
	cout << " 2.交换" << endl;


	vector<int> vec3;
	vec3.push_back(3);
	vec3.push_back(2);
	vec3.push_back(1);
	vec3.push_back(5);
	vec3.push_back(4);
	vec3.push_back(6);
	sort(vec3.begin(), vec3.end());
	for_each(vec3.begin(), vec3.end(), fun);
	cout << " 3.sort排序" << endl;

	sort(vec3.begin(), vec3.end(), greater<>());
	for_each(vec3.begin(), vec3.end(), fun);
	cout << " 4.sort排序(从大到小)" << endl;

	srand((unsigned int)time(0));//初始化随机数发生器,需要加#include<ctime>
	random_shuffle(vec3.begin(), vec3.end());
	for_each(vec3.begin(), vec3.end(), fun);
	cout << " 5.洗牌算法"<<endl;
}

void Print()
{
	cout << "------------------------------------------------------------------------------------" << endl << endl;
}

int main()

{
	Print();
	Constructor_vector();//vector构造
	Print();
	Attribute_vector();//vector属性
	Print();
	Output_vector();//vector输出
	Print();
	Construction_vector_iterator();//迭代器_构造
	Print();
	output_vector_iterator();//string迭代器_输出
	Print();
	Add_vector();//vector增加
	Print();
	Delete_vector();//vector删除
	Print();
	Other_vector();//vector其他操作
	Print();
	system("pause");
	return 0;
}

输出结果:

数组相关容器有三种:
1.vector,向量/动态数组:内存的分配原理与string一样,是连续的空间,空间不够用,会申请一个更大的连续空间,同时迭代器失效。
2.array,固定数组:空间固定。
3. valrray,针对数学计算而封装的容器。