C++黑马程序员——P201-203. vector容器 数据存取,互换空间,预留空间

发布时间 2023-04-20 22:59:39作者: 我会变强的
  • P201. vector容器——数据存取
  • P202. vector容器——互换容器
  • P203. vector容器——预留空间
  • P201. vector容器 数据存取

   

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
15 //vector容器 数据存取
16 void test01()
17 {
18     vector<int>v1;
19     for (int i = 0; i < 10; i++)
20     {
21         v1.push_back(i);
22     }
23 
24     //用中括号[]的方式访问vector中的元素
25     for (int i = 0; i < v1.size(); i++)
26     {
27         cout << v1[i] << " ";
28     }
29     cout << endl;
30 
31     //利用at方式访问元素
32     for (int i = 0; i < v1.size(); i++)
33     {
34         cout << v1.at(i) << " ";
35     }
36     cout << endl;
37 
38     //获取第一个元素
39     cout << "第一个元素为:" << v1.front() << endl;
40     //获取最后一个元素
41     cout << "最后一个元素为:" << v1.back() << endl;
42 }
43 
44 int main() 
45 {    
46     test01();
47     return 0;
48 }

运行结果:

  

 

  

 

  • P202. vector容器  互换容器

  

示例1:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 //打印vector的函数
 6 void PrintVector(vector<int>& v)
 7 {
 8     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
 9     {
10         cout << *it << " ";
11     }
12     cout << endl;
13 }
14 
15 //vector容器互换
16 //1. 基本使用
17 void test01()
18 {
19     vector<int>v1;
20     for (int i = 0; i < 10; i++)
21     {
22         v1.push_back(i);
23     }
24     cout << "交换前:" << endl;
25     PrintVector(v1);
26 
27     vector<int>v2;
28     for (int i = 10; i > 0; i--)
29     {
30         v2.push_back(i);
31     }
32     PrintVector(v2);
33 
34  v1.swap(v2);
35     cout << "交换后:" << endl;
36     PrintVector(v1);
37     PrintVector(v2);
38 }
39 
40 int main() 
41 {    
42     test01();
43     return 0;
44 }

运行结果:

  

 

示例2:

 1 //2. 实际用途
 2 //巧用swap可以收缩内存空间
 3 void test02()
 4 {
 5     vector<int>v;
 6     for (int i = 0; i < 100000; i++)
 7     {
 8         v.push_back(i);
 9     }
10 
11     cout << "v的容量为:" << v.capacity() << endl;
12     cout << "v的大小为:" << v.size() << endl;
13 
14     v.resize(3);
15     cout << "v的容量为:" << v.capacity() << endl;   //容量不会变小
16     cout << "v的大小为:" << v.size() << endl;   //size会变
17 
18     //巧用swap收缩内存
19     vector<int>(v).swap(v);
20     cout << "v的容量为:" << v.capacity() << endl;
21     cout << "v的大小为:" << v.size() << endl;
22 }
23 
24 
25 int main() 
26 {    
27     test02();
28     return 0;
29 }

运行结果:

  

图解:

  

 

  

总结:swap可以使两个容器互换,可以达到使用的收缩内存效果。

 

  • P203. vector容器  预留空间

  

不使用reserve时,统计内存开辟的次数:

 1 //vector容器 预留空间
 2 int num = 0;    //内存区域变更次数
 3 int* p = NULL;  //用于指向vector的首地址
 4 void test01()
 5 {
 6     vector<int>v;
 7     for (int i = 0; i < 100000; i++)
 8     {
 9         v.push_back(i);
10         //计算动态分配时变更了几次内存的区域
11         if (p != &v[0])
12         {
13             p = &v[0];
14             num++;
15         }
16     }
17     cout << "num = " << num << endl;
18 }
19 
20 int main() 
21 {    
22     test01();
23     return 0;
24 }

运行结果:

  

 

使用reserve预留内存空间:

 1 //vector容器 预留空间
 2 int num = 0;    //内存区域变更次数
 3 int* p = NULL;  //用于指向vector的首地址
 4 void test01()
 5 {
 6     vector<int>v;
 7     v.reserve(100000);
 8     cout << "v.capacity() = " << v.capacity() << endl;
 9     for (int i = 0; i < 100000; i++)
10     {
11         v.push_back(i);
12         //计算动态分配时变更了几次内存的区域
13         if (p != &v[0])
14         {
15             p = &v[0];
16             num++;
17         }
18     }
19     cout << "num = " << num << endl;
20 }
21 
22 int main() 
23 {    
24     test01();
25     return 0;
26 }

运行结果:

  

总结:如果数据量较大,可以一开始利用reserve预留空间。

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)