vector和list之erase()的用法區別
阿新 • • 發佈:2019-04-13
容器 的區別 工程 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()的用法區別