美文网首页
C++ 各个STL容器删除元素的最佳方法

C++ 各个STL容器删除元素的最佳方法

作者: book_02 | 来源:发表于2019-05-20 20:17 被阅读0次

    假设容器为 Container<int> c;, 其中Containervector, deque, string, list, map, set

    删除指定值

    对于 vector、deque、string

    最佳方法

    c.erase(remove(c.begin(), c.end(), 1963), c.end());
    

    这些容器都是连续内存的容器,删除一个会发生平移操作,由于容器中可能有多个指定值的元素,上述删除方法可以只移动一次,然后把指定值全删除掉

    例子

    #include <iostream>
    #include <vector>
    #include <string>
    #include <deque>
    #include <list>
    #include <algorithm>
    
    using namespace std;
    
    // erase
    int main()
    {
        // vector
        vector<int> nums = { 2, 4, 3, 2, 4, 7, 3, 7 };
        for (int num : nums) {
            cout << num << "\t";
        }
        cout << endl;
        nums.erase(remove(nums.begin(), nums.end(), 4), nums.end());
        for (int num : nums) {
            cout << num << "\t";
        }
        cout << endl << endl;
    
    
        // deque
        deque<int> dq = { 2, 4, 3, 2, 4, 7, 3, 7 };
        for (int num : dq) {
            cout << num << "\t";
        }
        cout << endl;
        dq.erase(remove(dq.begin(), dq.end(), 4), dq.end());
        for (int num : dq) {
            cout << num << "\t";
        }
        cout << endl << endl;
    
        // string
        string s = "24324737";
        cout << s << endl;
        s.erase(remove(s.begin(), s.end(), '4'), s.end());
        cout << s << endl << endl;
        
        system("pause");
        return 0;
    }
    

    效果如下:


    对于 list

    最佳方法

    c.remove(1963);
    

    因为list是链表形式的,直接remove就很高效

    例子

    #include <iostream>
    #include <list>
    #include <algorithm>
    
    using namespace std;
    
    // erase
    int main()
    {
        // list
        list<int> l;
        l.push_back(2); l.push_back(4); l.push_back(3); l.push_back(2);
        l.push_back(4); l.push_back(7); l.push_back(3); l.push_back(7);
        for (int num : l) {
            cout << num << "\t";
        }
        cout << endl;
        l.remove(4);
        for (int num : l) {
            cout << num << "\t";
        }
        cout << endl << endl;
    
        system("pause");
        return 0;
    }
    

    对于 map/multimap、set/multiset 关联型容器

    最佳方法

    c.erase(1963);
    

    使用成员函数erase(),因为关联型容器底层都是平衡二叉树结构

    例子

    #include <algorithm>
    #include <map>
    #include <set>
    
    using namespace std;
    
    // erase
    int main()
    {
        // multimap
        multimap<int, bool> m;
        m.insert(make_pair(2, true));  m.insert(make_pair(4, true));  m.insert(make_pair(3, true));
        m.insert(make_pair(2, true));  m.insert(make_pair(4, true));  m.insert(make_pair(7, true));
        m.insert(make_pair(3, true));  m.insert(make_pair(7, true));
    
        for (auto e : m) {
            cout << "(" << e.first << "," << e.second << ")" << "\t";
        }
        cout << endl;
        m.erase(4);
        for (pair<int, bool> e : m) {
            cout << "(" << e.first << "," << e.second << ")" << "\t";
        }
        cout << endl << endl;
    
        // set
        multiset<int> s;
        s.insert(2); s.insert(4); s.insert(3); s.insert(2);
        s.insert(4); s.insert(7); s.insert(3); s.insert(7);
        for (int num : s) {
            cout << num << "\t";
        }
        cout << endl;
        s.erase(4);
        for (int num : s) {
            cout << num << "\t";
        }
        cout << endl << endl;
    
        system("pause");
        return 0;
    }
    
    效果如下:

    参考资料

    《Effective STL》 Scott Meyers

    相关文章

      网友评论

          本文标题:C++ 各个STL容器删除元素的最佳方法

          本文链接:https://www.haomeiwen.com/subject/grmlzqtx.html