单端数组
数组是静态空间,但是vector可以动态扩展
动态扩展:并不是在原空间后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间。
因为没法保证后面的空间是不是空闲的
vector的迭代器是一个很强大的迭代器,因为它支持随机访问!
vector是单端数组,因为前端是封闭的,只能从尾部插入和删除,插入命令push_back(),删除pop_back();
vector的几个常用的迭代器:v.begin()指向容器的第一个元素,v.end()指向容器最后一个元素的下一个位置,v.rbegin指向最后一个元素,v.rend()指向第一个元素的前一个位置;还可以通过insert命令进行插入,erase命令进行删除等。
#include<iostream> #include<vector> #include<string> using namespace std; // vector容器的构造 void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { vector<int> v1; // 默认构造 for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); vector<int> v2(v1.begin(), v1.end()); // 区间方式 printVector(v2); vector<int> v3(10, 100); // n个elem printVector(v3); vector<int> v4(v3); // 拷贝构造 printVector(v4); } int main() { test01(); return 0; }
vector<int> v1; for (int i = 0; i < 10; i++) { v1.push_back(i); }
vector<int> v2;
v2 = v1;
vector<int>v3;
v3.assign(v1.begin, v1.end); // 区间左闭右开
vector<int> v4;
v4.assign(10, 100); // 赋值行为
capacity() >= size()
resize重新指定大小
resize更大默认填充0,如果需要改,传入elem
如果重新指定比原来短,超出部分会删除
insert注意要提供迭代器
#include<iostream> #include<vector> #include<string> using namespace std; // vector容器的插入和删除 void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { vector<int> v1; // 尾插法 v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); printVector(v1); // 尾删 v1.pop_back(); // 50删除 // 插入,第一个参数是迭代器 v1.insert(v1.begin(), 100); v1.insert(v1.begin(), 2, 100); //在最前面插入2个100 //删除 v1.erase(v1.begin()); v1.erase(v1.begin(), v1.end()); // 相当于清空 v1.clear(); // 清空操作,跟上面一样 } int main() { test01(); return 0; }
几个访问元素的方法
front和back
互换操作和实际用途
#include<iostream> #include<vector> #include<string> using namespace std; // vector容器的互换 void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } // void test01() { vector<int> v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); vector<int> v2; for (int i = 10; i > 0; i--) { v2.push_back(i); } printVector(v2); v1.swap(v2); // v1和v2容器的内容对应位置进行交换 } // 实际用途 // 巧用swap可以收缩内存空间 void test02() { vector<int> v; for (int i = 0; i < 100000; i++) { v.push_back(i); } cout << "v的容量为:" << v.capacity() << endl; // 138255 cout << "v的大小为:" << v.size() << endl; // 100000 v.resize(3); // 重新指定大小 cout << "v的容量为:" << v.capacity() << endl; // 138255 剩下空间全部浪费 cout << "v的大小为:" << v.size() << endl; // 3 // 巧用swap收缩内存 vector<int>(v).swap(v); // vector<int>(v) 匿名对象 会按照v目前的容量初始化这个匿名对象 .swap()容器交换 匿名对象当前行执行完立马回收 目的达成 } int main() { test02(); return 0; }
只是找了块空地,不能访问
有什么用:
#include<iostream> #include<vector> #include<string> using namespace std; // vector容器的互换 void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } // void test01() { vector<int> v1; // 统计总共动态扩展了多少次 // 利用reserse预留空间 v1.reserve(100000); int num = 0; int* p = nullptr; for (int i = 0; i < 100000; i++) { v1.push_back(i); if (p != &v1[0]) { p = &v1[0]; num++; } } cout << num << endl; // 30 } int main() { test01(); return 0; }