一、vector容器
1、功能:与数组非常相似,也称为单端数组。
2、区别:数组是静态空间,vector可以动态扩展。
动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝到新空间,释放原空间。
3、vector迭代器是支持随机访问的迭代器
4、构造函数
5、vector的容量和大小
函数原型:
empty(); 判断元素是否为空
capacity(); 容器的容量
size(); 返回容器中元素个数
resize(int num);重新指定容器的长度num,若变长,则以默认值填充,若变短,则删除超出容器长度的元素
resize(int num,elem); 重新指定容器的长度num,若变长,则以elem填充,若变短,则删除超出容器长度的元素.
6、vector的插入和删除
push_back(ele); 尾部插入
pop_back();尾部删除
insert(const_iterator pos,ele); 迭代器指向位置pos插入元素ele
insert(const_iterator pos,int count,ele); 迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); 删除迭代器指向元素
erase(const_iterator start, const_iterator end); 删除迭代器指向区间元素
clear();删除容器中全部元素
7、vector的数据存取
at(int idx); //返回容器中idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器第一个数据元素
back();//返回最后一个元素
代码:
- #include
-
- using namespace std;
-
- #include
-
- void printVector(vector<int>&v)
-
- {
-
- for (int i = 0; i < v.size(); i++)
-
- {
-
- cout << v[i] << " ";
-
- }
-
- cout << endl;
-
- for (int i = 0; i < v.size(); i++)
-
- {
-
- cout << v.at(i) << " ";
-
- }
-
- cout << endl;
-
- }
-
- void test01()
-
- {
-
- vector<int>v1;
-
- for (int i = 0; i < 10; i++)
-
- {
-
- v1.push_back(i);
-
- }
-
- printVector(v1);
-
- //输出第一个元素
-
- cout << "第一个元素为:" << v1.front() << endl;
-
- cout << "最后一个元素为:" << v1.back() << endl;
-
- }
8、vector互换容器
实现两个容器的互换
函数原型:swap(vec);//将vec与本身的元素互换
代码:
- void printVector(vector<int>&v)
-
- {
-
- for (int i = 0; i < v.size(); i++)
-
- {
-
- cout << v[i] << " ";
-
- }
-
- cout << endl;
-
- for (int i = 0; i < v.size(); i++)
-
- {
-
- cout << v.at(i) << " ";
-
- }
-
- cout << endl;
-
- }
-
- void test01()
-
- {
-
- vector<int>v1;
-
- for (int i = 0; i < 10; i++)
-
- {
-
- v1.push_back(i);
-
- }
-
- cout << "交换前" << endl;
-
- printVector(v1);
-
- vector<int>v2;
-
- for (int i = 11; i < 20; i++)
-
- {
-
- v2.push_back(i);
-
- }
-
- printVector(v2);
-
- cout << "交换后:" << endl;
-
- v1.swap(v2);
-
- printVector(v1);
-
- printVector(v2);
-
- }
效果:
实际作用:
- 巧用swap()可以收缩内存空间:
-
- void test02()
-
- {
-
- vector<int>v3;
-
- for (int i = 0; i < 100000; i++)
-
- {
-
- v3.push_back(i);
-
- }
-
- cout << "v3的大小为:" << v3.size() << endl;
-
- cout << "v3的容量为:" << v3.capacity()<< endl;
-
-
-
- //重新指定大小
-
- v3.resize(3);
-
- cout << "v3的大小为:" << v3.size() << endl;
-
- cout << "v3的容量为:" << v3.capacity() << endl; //此时大小为3 容量为138255 浪费空间
-
- //用swap收缩内存
-
- vector<int>(v3).swap(v3);
-
- //vector
(v3)是以v3作为拷贝对象,拷贝构造一个匿名对象, -
- //然后做一个容器之间的交换,交换后v3指向的是交换前匿名对象所指向的空间,容量为3,而匿名对象指向的是原本v3的空间,容量大小为138255
-
- //匿名对象的特点:使用完毕后 系统会自动回收其空间
-
- cout << "v3的大小为:" << v3.size() << endl;
-
- cout << "v3的容量为:" << v3.capacity() << endl;//此时大小为3 容量为3 浪费空间
-
- }
9、预留空间
功能:减少vector在动态扩展时的扩展次数
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
- //利用reserve预留空间
-
- void test02()
-
- {
-
- vector<int>v;
-
- int num=0;//统计开辟次数
-
- v.reserve(100000);
-
- int *p = NULL;
-
- for (int i = 0; i < 100000; i++)
-
- {
-
- v.push_back(i);
-
- if (p != &v[0])//如果p不指向首地址,则使其指向首地址
-
- {
-
- p = &v[0];
-
- num++;
-
- }
-
- }
-
- cout << "次数:" << num << endl; //没有预留 num=30 预留后num=1
-
- }