vector容器
概念
- 和数组非常相似
- vector可以动态扩展,但是数组不行
- 指向一片连续的内存
- 动态扩展是找个新的更大的空间来存放数据,而不是在后面接上新空间
迭代器失效的情况:当vector找到新的更大的空间时,以前的迭代器就失效了
构造
方法 | 作用 |
---|---|
vector v; | 采用模板实现类实现,默认构造函数 |
vector(v.begin() , v.end()) | 将v[begin(),end())区间中的元素拷贝给本身(注意是前闭后开) |
vector(n, elem) | 构造函数将n个elem拷贝给本身 |
vector(const vector &vec) | 拷贝构造 |
赋值
比较简单,一般使用operator= 和assign都可以
方法 | 作用 |
---|---|
vector& operator=(const vector &vec) | 重载等号操作符 |
assign(beg,end); | 将[beg,end]区间中的数据拷贝赋值给本身 |
assign(n,elem) | 将n个elem拷贝给本身 |
void printfVector(vector<int> &Obj)
{
for (vector<int>::iterator it = Obj.begin(); it != Obj.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void func()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printfVector(v1);
//赋值方式给1 operator=
vector<int> v2;
v2 = v1;
printfVector(v2);
//assign 将[beg,end]区间中的数据拷贝赋值给本身
vector<int> v3;
v3.assign(v1.begin(), v1.end());
printfVector(v3);
//assign(n, elem) 将n个elem拷贝给本身
vector<int> v4;
v4.assign(5,10);
printfVector(v4);
}
容量和大小
方法 | 作用 |
---|---|
empty(); | 判断容器是否为空 |
capacity(); | 容器的容量 |
size(); | 返回容器中元素的个数 |
resize(int num); | 重新指定容器的长度为num 若变长,则以默认值填充新的位置, 若变短,则超出容器部分被删除 |
resize(int num ,elem) | 重新指定容器的长度为num 若变长,则以elem填充新的位置 若变短,则超出容器部分被删除 |
注意:resize改变的是size而不是capacity
void printfVector(vector<int> &Obj)
{
for (vector<int>::iterator it = Obj.begin(); it != Obj.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void func()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printfVector(v1);
//empty(); 判断容器是否为空
if (v1.empty())
{
cout << "vector容器为空 " << endl;
}
else
{
cout << "vector容器的容量为 = " << v1.capacity() << endl;
cout << "vector容器的大小为 = " << v1.size() << endl << endl;
cout << "vector容器的变小后" << endl;
v1.resize(5);
printfVector(v1);
cout << endl;
cout << "vector容器的扩大后" << endl;
v1.resize(10, 6);
printfVector(v1);
cout << endl;
}
}
插入和删除
方法 | 作用 |
---|---|
push_back(elem); | 尾部插入元素 |
pop_back(); | 删除最后一个元素 |
insert(const_iterator pos,elem) | 迭代器指向位置插入元素elem |
insert(const_iterator pos, int Count, elem) | 迭代器指向位置pos插入count个元素elem |
erase(const_iterator pos); | 删除迭代器指向的元素 |
erase(const_iterator start, const_iterator end) | 删除迭代器从start到end之间的元素 |
clear(); | 删除容器中所有元素 |
void printfVector(vector<int> &Obj)
{
if (Obj.size() == 0)
{
cout << "vector容器为空!";
}
for (vector<int>::iterator it = Obj.begin(); it != Obj.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void func()
{
//尾插法插入元素
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printfVector(v1);
//删除最后一个元素
v1.pop_back();
printfVector(v1);
//迭代器指向位置插入元素elem
v1.insert(v1.begin(), 6);
v1.insert(v1.begin(), 2, 50);
printfVector(v1);
//删除迭代器指向的元素
v1.erase(v1.begin());
printfVector(v1);
vector<int>::iterator it = v1.begin();
it = it + 2;
v1.erase(v1.begin(), it);
printfVector(v1);
v1.clear(); //清空
printfVector(v1);
}
数据存取
方法 | 作用 |
---|---|
at(int idx); | 返回索引idx所指的数据 |
operator[]; | 返回索引idx所指的数据 |
front(); | 返回容器中第一个数据元素 |
back() | 返回容器中最后的一个数组元素 |
//用at()访问第i个元素
void printfVector(vector<int> &Obj)
{
if (Obj.size() == 0)
{
cout << "vector容器为空!";
}
for (int i= 0;i<Obj.size();i++)
{
cout << Obj.at(i) << " ";
}
cout << endl;
}
void func()
{
//用[]访问第i个元素
vector<int> v1;
for (int i = 0; i < 10; i++)
{
//v1[i] = i; 在此之前是因为容量和大小为0,该语句属于越界访问!
v1.push_back(i);
}
printfVector(v1);
cout << " 第一个元素为 = " << v1.front() << endl;
cout << "最后一个元素为 = " << v1.back() << endl;
}
互换容器
方法 | 作用 |
---|---|
swap(vec) | 将vec与本身的元素互换 |
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
cout << "v1容器为:" << endl;
printfVector(v1);
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v2.push_back(i*10);
}
cout << "v2容器为:" << endl;
printfVector(v2);
//互换容器
cout << "互换后容器后" << endl;
v2.swap(v1);
cout << "v1容器为:" << endl;
printfVector(v1);
cout << "v2容器为:" << endl;
printfVector(v2);
根据vector的特性,容器的容量是>=容器的大小。如果一个容器原来非常大,但是使用resize之后改变了size但是没有改变capacity,就可以使用交换方法来减少capacity
原理:vector<int>(v1).swap(v1)
可分解为:vector<int>(v1)
和.swap(v1)
两部分
vector<int>(v1)
:表示创建匿名对象(以用v1进行拷贝构造)
.swap(v1)
:表示匿名对象和v1进行容器互换,进而减小容器的容量空间
预留空间
主要作用:减少vector在动态扩展容量时的开展次数
方法 | 作用 |
---|---|
reserve(int len) | 容器预留len个元素长度,预留位置不初始化,元素不可访问 (更改容量) |
int* p = NULL; //记录每次的v1首地址
int count = 0; //统计开辟次数
vector<int> v1;
//如果已知要这么大的空间就可以先预留,避免Vector多次开辟
v1.reserve(100005);
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (p != &v1[0])
{
p = &v1[0];
count++;
}
}
cout << "开辟次数 count = " << count << endl;