Vector又称为单端数组,与数组不同的是,vector可以动态扩展。
动态扩展并不是在原有空间中续接新空间,而是寻找更大的空间,然后将原数据拷贝到新空间,释放原空间。
Vector
Vector(v.begin(),v.end()); //将v[gegin(),end()]区间中的元素拷贝给本身
Vector(n,elem); //将n个elem拷贝给本身
Vector(const vector& vec); //拷贝构造函数
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v1; //默认构造,无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//通过区间方式构造
vectorv2(v1.begin(), v1.end());
printVector(v2);
//n个elem的构造
vector v3(10, 100);
printVector(v3);
//拷贝构造
vector v4(v3);
printVector(v4);
}
int main()
{
test01();
}
功能:为vector容器进行赋值
可以用“=”号进行赋值,也可使用函数assign赋值。
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v1; //默认构造,无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//等号赋值
vector v2;
v2 = v1;
printVector(v2);
//assign方式
vector v3;
v3.assign(v1.begin(),v1.end());
printVector(v3);
}
int main()
{
test01();
}
Empty() |
判断容器是否为空 |
Capacity() |
容器的容量 |
Size() |
返回容器中元素的个数 |
Resize(int num) |
重新制定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。 |
Resize(int num, elem) |
重新制定容器的长度为num,若容器变长,则以elem填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。 |
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v1; //默认构造,无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//判断是否为空
if (v1.empty())
{
cout << "v1 为空!" << endl;
}
else
{
cout << "v1 不为空!" << endl;
cout << "v1的容量为多少" << v1.capacity() << endl; //将输出13
cout << "v1的大小为多少" << v1.size() << endl; //将输出10
}
//重新指定大小
v1.resize(15);
printVector(v1); //将在后面添加5个默认值,默认值为0
v1.resize(5);
printVector(v1); //如果重新制定的短了,超出部分会被删掉
}
int main()
{
test01();
}
Push_back(elem) |
尾部插入元素elem |
Pop_back() |
删除最后一个元素 |
Insert(const_iterator pos, elem) |
迭代器向指定位置pos插入元素elem |
Insert(const_iterator pos, int count elem) |
迭代器向指定位置pos插入count个元素elem |
Erase(const_iterator pos) |
删除迭代器指向的元素 |
Erase(const_iterator start, const_iterator end) |
删除迭代器从strat到end之间的所有元素 |
Clear() |
删除容器中所有元素 |
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v1;
v1.push_back(10); //尾插法插入数据
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//遍历
printVector(v1);
//删除尾部元素
v1.pop_back();
printVector(v1);
//插入,第一个参数是迭代器
v1.insert(v1.begin(), 100);
printVector(v1);
//插入多个数据
v1.insert(v1.begin(), 2,1000);
printVector(v1);
//删除特定位置的元素
v1.erase(v1.begin());
printVector(v1);
//删除区间的元素
v1.erase(v1.begin()+1,v1.end()-2);
printVector(v1);
}
int main()
{
test01();
}
At(int idx) |
通过索引idx指向数据 |
operator[] |
[]返回,和数组一样 |
Front |
返回容器中第一个数据元素 |
Back |
返回容器中最后一个数据元素 |
功能:实现两个容器内的元素交换。
实际用途:巧用swap可以收缩内存空间
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
cout << "交换前:" << endl;
printVector(v1);
vector v2;
for (int i = 10; i >0; i--)
{
v2.push_back(i);
}
printVector(v2);
cout << "交换后:" << endl;
v1.swap(v2); //进行交换
printVector(v1);
printVector(v2);
}
void test02() //利用swap收缩内存空间
{
vector v;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
}
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
v.resize(3);
cout << "v的容量:" << v.capacity() << endl; //容量不会变成3
cout << "v的大小:" << v.size() << endl; //大小会变成3
//利用swap收缩内存
vector(v).swap(v); //先创建一个匿名对象,然后与之交换
//匿名对象在该行执行完之后将被系统自动回收
cout << "v的容量:" << v.capacity() << endl;
cout << "v的大小:" << v.size() << endl;
}
int main()
{
//test01();
test02();
}
功能:减少vector在动态扩展容量时的扩展次数。预留位置不会初始化,元素不可访问。
#include
#include
using namespace std;
void printVector(vector& v)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector v;
v.reserve(10000); //上来直接分很长的空间,如果不预留,num会等于24
int num = 0; //统计内存开辟次数
int* p = NULL;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
if (p != &v[0])
{
p = &v[0];
num++;
}
}
cout << num << endl;
}
int main()
{
test01();
}