STL 4.vector容器
4.1 与数组类似,但是个动态分配内存(并不是原有空间下动态,而是开辟新空间,拷贝以及释放原空间);
4.2 构造、赋值
4.3 交换 swap
4.4 size 当前元素多少
4.5 capacity 容器容量大小
4.6 empty 容器是否为空
4.7 resize 重新制定容器长度,
4.7.1 如果比原来长了,默认用0填充,可以用第二个参数代替默认值
4.7.2 如果比原来短了,超出的部分元素就被删除掉了
4.8 reserve 预留空间,但是不初始化
4.9 at、 [ ] 对元素存取,at越界抛出异常,[ ]越界直接挂
4.10 第一个元素用front
4.11 最后一个元素用back
4.12 插入 insert(迭代器)、 删除 erase(迭代器)、清空 clear、尾插 push_back、尾删 pop_back;
练习:
1、巧用swap来收缩内存: vector<int>(v).swap(v);
1 //用swap收缩内存 2 3 4 #include<iostream> 5 #include<vector> 6 using namespace std; 7 8 void test04() { 9 vector<int> v; 10 for (int i = 0; i < 1000; i++) { 11 v.push_back(i); 12 } 13 cout << "v的容量:" << v.capacity() << endl;//容量大小内部实现,无从得知 14 cout << "v的大小:" << v.size() << endl; 15 16 v.resize(3); 17 cout << "v的容量:" << v.capacity() << endl; 18 cout << "v的大小:" << v.size() << endl; 19 20 //收缩内存 21 vector<int>(v).swap(v);//vector<int>(v) 编译器通过拷贝构造函数用v的内容制造了一个匿名对象,然后跟v所指的交换 22 cout << "v的容量:" << v.capacity() << endl; 23 cout << "v的大小:" << v.size() << endl; 24 } 25 26 int main() { 27 28 test04(); 29 30 system("pause"); 31 return 0; 32 }
2、巧用reserve来预留空间:v.reserve(1000);//一下子就预留这么多空间
1 //用reserve预留空间 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 6 void test05() { 7 8 vector<int> v; 9 10 v.reserve(1000);//一下子就预留这么多空间 11 12 int number = 0; 13 int* p = NULL; 14 15 for (int i = 0; i < 1000; i++) { 16 v.push_back(i); 17 if (p != &v[0]) 18 { 19 p = &v[0]; 20 number++; //number的次数,等于找了多少次空间去开辟 21 } 22 } 23 cout << "number=" << number << endl; 24 } 25 26 27 int main() { 28 29 test05(); 30 system("pause"); 31 return 0; 32 }
3、逆序遍历与容器能否支持随机访问的判断:
vector<int>::reverse_iterator itBegin=v.rbegin();
迭代器 itBegin=itBegin+1;//是否编译通过
1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 void test05() { 7 8 vector<int> v; 9 10 v.push_back(10); 11 v.push_back(40); 12 v.push_back(20); 13 v.push_back(30); 14 15 cout << "逆序遍历的结果:" << endl; 16 for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++) { 17 cout << *it << endl; 18 } 19 20 21 //vector容器的迭代器,随机访问的迭代器 22 //如何判断一个容器的迭代器是否支持随机访问 23 vector<int>::reverse_iterator itBegin=v.rbegin(); 24 25 itBegin++; //说明双向访问 26 itBegin--; 27 itBegin = itBegin + 1;//类型内部重载了这个+号,说明vector容器的迭代器可以跳跃式访问 28 29 30 list<int> li; 31 li.push_back(10); 32 li.push_back(20); 33 li.push_back(30); 34 35 list<int>::iterator liBegin = li.begin(); 36 37 liBegin++;//++与——可以通过,说明双向访问 38 liBegin--; 39 40 liBegin = liBegin + 1;//类型内部没有重载这个+号,意思是不允许随便加(跳跃式的访问) 41 } 42 43 44 int main() { 45 46 test05(); 47 system("pause"); 48 return 0; 49 }

浙公网安备 33010602011771号