尽量不要用insert在头部进行插入操作,因为要移动大量元素。
动态增长原理
插入新元素时,如果原来的空间不够,那么vector会重新申请一个更大的空间,将原来的数据拷贝过来,将原来的空间释放掉,把新元素插入到重新申请的空间。
vector构造函数
void printvector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void printvector1(int v)
{
cout<<v<<" ";
}
void test01()
{
vector<int> v1;//默认构造
int arr[] = { 10,20,30,40 };
vector<int>v2(arr, arr + sizeof(arr) / sizeof(int));
vector<int> v3(v2.begin(), v2.end());
vector<int>v4(v3);
/*for (vector<int>::iterator it =v4.begin(); it != v4.end(); it++)
{
cout << *it << " ";
}
cout << endl;
*/
/*printvector(v1);
printvector(v2);
printvector(v3);
printvector(v4);*/
vector<int>::iterator pbegin = v4.begin();//指向第一个元素
vector<int>::iterator pend = v4.end();
for_each(pbegin, pend, printvector1);
}
vector常用赋值操作
void test02()
{
int arr[] = { 10,20,30,40 };
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//默认构造
//成员方法
vector<int>v2;
v2.assign(v1.begin(), v1.end());
//重载等号
vector<int>v3;
v3 = v2;
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr) / sizeof(int));//默认构造
printvector(v1);
printvector(v2);
printvector(v3);
printvector(v4);
cout << "---------------------------" << endl;
v4.swap(v1);//交换v1 v4的内容,交换的是指向内容的指针
printvector(v1);
printvector(v2);
printvector(v3);
printvector(v4);
}
vector大小操作
resize 若容器变长,则以默认值填充新位置,如果容器变长,则末尾超出容器长度的元素被删除。
void test3()
{
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));
cout << "size:" << v4.size() << endl;
if (v4.empty())//if (v4.empty()==true)
cout << "空" << endl;
else {
cout << "不空" << endl;
}
v4.resize(2);//100 200
printvector(v4);
v4.resize(6);//100 200 0 0 0 0 默认添0
printvector(v4);
v4.resize(8,1);//默认添1
printvector(v4);//100 200 0 0 0 0 1 1
for (int i = 0; i < 1000; i++)
{
v4.push_back(i);
}//先多申请点空间 不够再申请
cout << "v4.size:" << v4.size() << endl;//元素个数1008
cout << "v4.capacity()" << v4.capacity() << endl;//容量1066
}
vector数据存取操作
//存取操作
void test4()
{
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));
for (int i = 0; i < v4.size(); i++)
{
cout << v4[i] << " ";
}
cout << endl;
for (int i = 0; i < v4.size(); i++)
{
cout << v4.at(i) << " ";
}
cout << endl;
//区别 at抛异常,[]不抛异常
cout << "front" << v4.front() << endl;
cout << "back" << v4.back() << endl;
}
vector插入和删除操作
void test5()
{
vector<int>v;
v.push_back(10);
v.push_back(20);
//头插法
v.insert(v.begin(), 30);
v.insert(v.end(), 40);
printvector(v);//30 10 20 40
v.insert(v.begin() + 2, 50);//能+2是因为vector支持随机访问,否则只能+1
//支持中括号[]下标访问的都支持随机访问
printvector(v);
//删除
v.erase(v.begin());
printvector(v);
v.erase(v.begin() + 1,v.end());//删掉从第二个位置到最后
printvector(v);
v.clear();
cout << "size" <<v. size() << endl;
}
收缩空间
//巧用swap左键空间
void test6()
{
//vector 添加元素 他会自动增长,删除元素时,不会自动减少
vector<int> v;
for (int i = 0; i < 1000; i++)
{
v.push_back(i);
}
cout << "size" << v.size() << endl;//1000
cout << "capacity" << v.capacity() << endl;//1066
v.resize(10);
cout << "size" << v.size() << endl;//10
cout << "capacity" << v.capacity() << endl;//1066
//容量并没有减少 对于此时 应该收缩容量
//收缩空间
vector<int>(v).swap(v);//vector<int>(v) 用v初始化匿名对象
//初始化完成之后进行交换,指针指向发生交换
cout << "size" << v.size() << endl;//10
cout << "capacity" << v.capacity() << endl;//1066
}
reserve和resize的区别?
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素
resize()是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了
void test7()
{
//reverse 预留空间
int num = 0;
int *address = NULL;
vector<int> v;
v.reserve(1000);
for (int i = 0; i < 1000; i++)
{
v.push_back(i);
if (address != &(v[0]))//v[0]数据首地址
{
address = &(v[0]);
num++;
}
}//如果你知道元素大概要存储的元素个数,那么你可以用reserve预留空间
cout << "num" << num << endl;
}