#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,针对数学计算而封装的容器。