1 vector基本概念
功能: vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别: 数组是静态空间,而vector可以动态扩展。数组在初始化时,一旦分配了内存就不能再扩展了,但是vector却可以。例如,数组arr[5],就只能存放5个数据,不能再次扩展。vector一开始指定了5个容量,如果想再加新数据的话,还可以再次动态扩展容量。
动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。也就是说,vector的动态扩展是找一个内存更大的新空间并拷贝原数据,再释放原内存空间。
vector容器的迭代器是支持随机访问的迭代器
可以看到vector是左闭右开的容器,常用的迭代器是v. begin() 和v.end(),前者指向第一个元素,后者指向最后一个元素的下一个位置。vector容器还封装了很多对外接口,比如插值insert()、尾插法push_back()、尾删法pop_back()等等。
2 vector构造函数
功能描述: 创建vector容器
函数原型:
vector<T> v;
——————————采用模板实现类实现,默认构造函数vector(v.begin(), v.end());
————–将v [ begin(), end() ) 区间中的元素拷贝给本身,注意拷贝的元素是左闭右开区间。vector(n, elem);
—————————构造函数将n个elem拷贝给本身。vector(const vector &vec);
—————拷贝构造函数。
代码示例:
void printVector(vector<int> v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
//vector容器构造
void test1()
{
vector<int> v1;//默认构造 无参构造
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
cout << "v1:"; printVector(v1); cout << endl;
vector<int> v2(v1.begin(), v1.end());//将v [ begin(), end() ) 区间中的元素拷贝给本身
cout << "v2:"; printVector(v2); cout << endl;
vector<int> v3(10, 6);//构造函数将n个elem拷贝给本身 10个6
cout << "v3:"; printVector(v3); cout << endl;
vector<int> v4(v3);//拷贝构造函数
cout << "v4:"; printVector(v4); cout << endl;
}
总结: vector的多种构造方式没有可比性,灵活使用即可
3 vector赋值操作
功能描述: 给vector容器进行赋值
函数原型:
vector& operator=(const vector &vec);
————-重载等号操作符assign(beg, end);
————————————将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem);
————————————-将n个elem拷贝赋值给本身。
代码示例:
void printVector(vector<int> v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
//vector容器构造
void test1()
{
vector<int> v1;//默认构造 无参构造
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
cout << "v1:"; printVector(v1); cout << endl;
//赋值 operator=
vector<int> v2;
v2 = v1;//重载等号= 操作符
cout << "v2:"; printVector(v2); cout << endl;
//赋值 assign 这不是构造 是赋值
vector<int> v3;
v3.assign(v1.begin(), v1.end());//将[beg, end)区间中的数据拷贝赋值给本身。
cout << "v3:"; printVector(v3); cout << endl;
//赋值 assign 这不是构造 是赋值
vector<int> v4;
v4.assign(10, 100);//将n个elem拷贝赋值给本身。
cout << "v4:"; printVector(v4); cout << endl;
}
总结: vector赋值方式比较简单,使用operator=,或者assign都可以
4 vector容量和大小
功能描述: 对vector容器的容量和大小操作
函数原型:
-
empty();
————————–判断容器是否为空,空返回true,不为空返回false -
capacity();
————————容器的容量,capacity≥size -
size();
—————————–返回容器中元素的个数,capacity≥size -
resize(int num);
——————重新指定容器的长度为num,若容器变长,则以默认值0填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。 -
resize(int num, elem);
————重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
代码示例:
void printVector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
//vector容器构造
void test1()
{
vector<int> v1;//默认构造 无参构造
for (int i = 0; i < 10; ++i)
{
v1.push_back(i+1);
}
cout << "v1:"; printVector(v1);
if (v1.empty())
{
cout << "容器为空!" << endl;
}
else
{
cout << "容器不为空!" << endl;
cout << "容器的容量为:" << v1.capacity() << endl;
cout << "容器的大小为:" << v1.size() << endl;
}
cout << string(50, '-') << endl;
//重新指定大小 比原来长
v1.resize(12);//默认值0 填充
cout << "v1:"; printVector(v1); cout << endl;
cout << string(50, '-') << endl;
v1.resize(15, 1);//指定值1 填充
cout << "v1:"; printVector(v1); cout << endl;
cout << string(50, '-') << endl;
//重新指定大小 比原来短
v1.resize(10);//把超出的部分删除
cout << "v1:"; printVector(v1); cout << endl;
cout << string(50, '-') << endl;
}
总结:
- 判断是否为空 — empty
- 返回元素个数 — size
- 返回容器容量 — capacity
- 重新指定大小 — resize