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

  • 相关阅读:
    [二分][dp] Jzoj P3463 军训
    [树状数组] Jzoj P3462 休息
    [期望] Jzoj P3459 TheSwaps
    [dp] Jzoj P3460 Mixing Chemicals
    [数位dp][状压dp] Jzoj P3458 密码
    [匈牙利] Jzoj P1156 使命的召唤
    [bfs][状压] Jzoj P2121 分球
    [dp] Jzoj P1187 最大公共子串
    [树套树] Jzoj P5699 【gdoi2018 day1】涛涛接苹果
    [枚举] Jzoj P3387 终极武器
  • 原文地址:https://www.cnblogs.com/cc111/p/10702068.html
Copyright © 2020-2023  润新知