vector和list之erase()的用法区别

  • 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研发工程师编程题-删数)

  输入: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()的区别

 

posted @ 2019-04-13 17:38  Iridescent18  阅读(858)  评论(0编辑  收藏  举报