• vector的本质是数组,在内存中占有一段连续的空间
  • list是由双向链表实现的,所以内存空间是不连续的

  这两种容器,由于底层不同,因此erase()的使用也会有所不同:对于vector来说,用erase()删除其中的一个元素后,它的迭代器会自增1,而list不会。以一个例子来说明:

  要求实现:有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。(华为2016研发工程师编程题-删数)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  输入:8

  输出:6

  • 用list实现
 1 #include <iostream>
 2 #include <list>
 3 using namespace std;  4 
 5 int main()  6 {  7     int n;  8     while(cin>>n) {  9         vector<int> v; 10         //if (n > 1000) 11         // n = 1000;
12         for (int i = 0; i < n; ++i) { 13  v.push_back(i); 14  } 15 
16         vector<int>::iterator it = v.begin(); 17         while (v.size() > 1) { 18             for (int i = 0; i < 2; ++i) { 19                 ++it; 20                 if (it == v.end()) 21                     it = v.begin(); 22  } 23             vector<int>::iterator deleteN = it; 24             ++it; 25             if (it == v.end()) 26                 it = v.begin(); 27             //it = deleteN+1
28  v.erase(deleteN); 29 // cout<<*it<<endl;
30  } 31 
32         cout << *it << endl; 33  } 34     return 0; 35 }

 

 

  • 用vector实现

 

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;  4 
 5 int main()  6 {  7     int n;  8     while(cin>>n) {  9         vector<int> v; 10         //if (n > 1000) 11         // n = 1000;
12         for (int i = 0; i < n; ++i) { 13  v.push_back(i); 14  } 15 
16         vector<int>::iterator it = v.begin(); 17         while (v.size() > 1) { 18             for (int i = 0; i < 2; ++i) { 19                 ++it; 20                 if (it == v.end()) 21                     it = v.begin(); 22  } 23             vector<int>::iterator deleteN = it; 24 // ++it;
25             if (it+1 == v.end()) 26                 it = v.begin(); 27             //it = deleteN+1
28  v.erase(deleteN); 29 // cout<<*it<<endl;
30  } 31 
32         cout << *it << endl; 33  } 34     return 0; 35 }

 

 

 

  在实际应用中:如果需要高效的存取操作,选择vector,如果有大量的插入删除操作,选择 list。所以本题最好用list实现,用在此处只是为了辨别vector和list使用erase()的区别

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄