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 }

 

 

 

posted @ 2020-03-22 11:05  一二三的三二一  阅读(126)  评论(0)    收藏  举报