一 特性说明
vector是一个动态数组,当空间不足的时候插入新元素,vector会重新申请一块更大内存空间,将旧空间数据拷贝到新空间,然后释放旧空间。Vector是单口容器,所以在尾端插入和删除效率较高,在指定位置插入,势必会引起元素移动,效率较低。
****reserv和resize的区别?
答:reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,酒可以引用容器内的对象了。
1 Vector 拷贝构造
2常用赋值操作
3-vector的大小操作
4-数据存储操作
5-插入与删除操作
实例:
```cpp
#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;
}
///////////////////////1-初始化
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());//将V3用V2来初始化
vector<int>v4(v3);
printVector(v2);
printVector(v3);
printVector(v4);
}
/////////////////2-常用赋值操作
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());//通过v1给v2赋值
//重载=
vector<int>v3;
v3 = v2;
int arr1[] = { 100,200,300,400 };
vector<int>v4(arr1, arr1 + sizeof(arr1) / sizeof(int));
printVector(v1);
printVector(v2);
printVector(v3);
printVector(v4);
cout << "------------------------------------" << endl;
//交换
v4.swap(v1);//交换的实质是指针指向的交换
printVector(v1);
printVector(v2);
printVector(v3);
printVector(v4);
}
//////////////////3-大小操作
void test03() {
int arr1[] = { 100,200,300,400 };
vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int));
cout << "size:" << v1.size() << endl;//元素个数
if (v1.empty())
cout << "空!" << endl;
cout << "不空" << endl;
printVector(v1);
v1.resize(2);//resize 若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
//输出:100 200
printVector(v1);
v1.resize(6,1);//输出100 200 1 1 1 1 变长,多的改为1.若写成v1.resize(6);输出100 200 0 0 0 0
printVector(v1);
cout << v1.capacity() << endl;//容量输出
}
////////////4-vector 存取数据
void test04() {
int arr1[] = { 100,200,300,400 };
vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int));
for (int i = 0; i < v1.size(); ++i)
cout << v1[i] << " ";
cout << endl;
for (int i = 0; i < v1.size(); ++i)
cout << v1.at(i) << " ";
cout << endl;
//区别:at抛异常 []不抛异常
cout << "front:" << v1.front() << endl;
cout << "end:" << v1.back() << endl;
}
/////////////5-插入删除
void test05() {
vector<int>v;
v.push_back(10);
v.push_back(20);
//头插法
v.insert(v.begin(), 30);//在头插入30
v.insert(v.end(), 40);//在尾插入40
v.insert(v.begin() + 2, 100);//在第二个位置上插入100 //vector支持随机访问
//支持数组下标,一般都支持随机访问
//迭代器可以直接+2, +3 -2 -5操作
printVector(v);//30 10 100 20 40
//删除
v.erase(v.begin());//删除第一个
printVector(v);
v.erase(v.begin() + 1, v.end());//删除第二个到最后的
printVector(v);
v.clear();//清空所有
printVector(v);
}
//巧用swap缩减空间
void test06() {
//vector 添加元素,它会自动增长 删除元素时候,不会自动减少。
vector<int>v;
for (int i = 0; i < 100000; ++i)
v.push_back(i);
cout << "size:" << v.size() << endl;// 100000
cout << "capacity:" << v.capacity() << endl;//138255
v.resize(10);
cout << "---------------------------" << endl;
cout << "size:" << v.size() << endl; //10
cout << "capacity:" << v.capacity() << endl;//138255
//收缩空间
vector<int>(v) //这是个匿名对象
.swap(v);//用v来初始化这个对象,那么会动态对其进行空间的分配
cout << "---------------------------" << endl;
cout << "size:" << v.size() << endl;//10
cout << "capacity:" << v.capacity() << endl;//10
}
int main() {
//test01();
//test02();
//test03();
//test04();
//test05();
test06();
return 0;
}
reserve 预留空间 与resize区别
void test07() {
//reserve 预留空间 与resize区别
int num = 0;//计数对象拷贝的次数
int* address = NULL;
vector<int>v;
v.reserve(100000);//该句话不加之前 需要拷贝24次或者别的次数(电脑软件不同),当加上该句之后最后结果Num=1;
//reserve(100000) 代表一开始给v预留100000个空间
for (int i = 0; i < 10000; ++i) {
v.push_back(i);
if (address != &(v[0])) {
address = &(v[0]);
num++;
}
}
cout << "num:" <<num<<endl;
}