zoukankan      html  css  js  c++  java
  • 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()的区别

  • 相关阅读:
    assign()与create()的区别
    ES6对象扩展——部分新的方法和属性
    ES6对象扩展——扩展运算符
    rest operater剩余操作符
    深拷贝和浅拷贝
    for in和for of的简单区别
    查询ES6兼容的网站
    ES6扩展——对象的扩展(简洁表示法与属性名表达式)
    滚动条设置样式
    marquee横向无缝滚动无js
  • 原文地址:https://www.cnblogs.com/cc111/p/10702068.html
Copyright © 2011-2022 走看看