1. 程式人生 > >vector和list之erase()的用法區別

vector和list之erase()的用法區別

容器 的區別 工程 using esp del col end push_back

  • 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()的區別

vector和list之erase()的用法區別