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()的区别。