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研发工程师编程题-删数)
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()的区别。

更多精彩