zoukankan      html  css  js  c++  java
  • 6.6-数据结构&算法-列表/堆栈/队列

    五、列表
    4.merge - 合并
    void merge (list& lst);
    void merge (list& lst, Comp compfunction);
    将有序的参数列表合并到调用列表中,保证合并后的调用列表依然有序。
    注意:任何容器,在结构性修改之前获得的迭代器,有可能因为这种修改而失效,或者不能标识正确的位置,需要重新初始化。
    六、堆栈
    stack  底层容器vector/deque/list
    push   push_back
    pop    pop_back
    top    back
    size   size
    empty  empty
    ...    ...
    #include <stack>
    stack<int, vector<int> > si;
    stack<string, list<string> > ss;
    stack<double> sd; // 缺省底层容器deque
    template<typename T, typename C>
    stack {
    public:
      void push (const T& data) {
        m_container.push_back (data);
      }
      void pop (void) {
        m_conainer.pop_back ();
      }
      T& top (void) {
        return m_container.back ();
      }
    private:
      C m_container;
    };
    七、队列
    queue   底层容器deque/list
    push    push_back
    pop     pop_front
    front   front
    back    back
    size    size
    empty   empty
    ...
    queue<int, list<int> > qi;
    queue<string> qs; // 缺省底层容器deque
    八、优先队列(priority_queue)
    优者先出
    底层容器:vector/deque/list,缺省deque
    通过类型实参以比较器的形式定义比较规则
    九、映射(map)
    1.key-value对的容器,通过pair表示key-value对。
    template<typename FIRST, typename SECOND>
    class pair {
    prublic:
      ...
      FIRST first;
      SECOND second;
    };
    2.key唯一且升序。
    3.支持下标运算符,可以用[key]访问value。
    4.可以通过比较器类型自定义key升序的规则。
    练习:编写程序,统计一个文本文件中每个单词出现的频率。按照词汇表的顺序打印输出。
    apple : 2
    beijing : 2
    c++ : 3
    ...
    十、集合
    十一、多重映射
    key可重复,升序,迭代时key相同的元素相邻。
    upper_bound(key)成员函数返回和参数key相匹配的所有记录中最后一条记录的下一条记录的迭代器。
    十二、多重集合
    十三、泛型算法
    1.STL中包含60种泛型算法,其中包含23种非修改算法,如find,37种修改算法,如sort。
    2.STL中的泛型算法多数都会迭代器实现对容器元素的访问。
    3.STL中的泛型算法凡是涉及到比较大小的算法,都支持两种比较方案——“<”运算符和比较器函数对象。
    4.除了STL中的容器以外,程序员也可以使自定义的容器,获得STL泛型算法的支持,只要改自定义类型能够支持此算法对迭代器的使用规则即可。
    练习:实现一个泛型的拷贝函数,用将一个容器中数据拷贝到另一个容器中。
    POP->OOP->DP
    copy.cpp
     
    #include <vector>
    #include <deque>
    #include <list>
    #include "../day12/print.h"
    template<typename IT1, typename IT2>
    void my_copy (IT1 begin, IT1 end, IT2 to) {
        while (begin != end)
            *(to++) = *(begin++);
    }
    int main (void) {
        int arr1[5] = {10, 20, 30, 40, 50};
        int arr2[5];
        copy (arr1, arr1 + 5, arr2);
        print (arr2, arr2 + 5);
        vector<int> vec (5);
        copy (arr1, arr1 + 5, vec.begin ());
        print (vec.begin (), vec.end ());
        deque<int> deq (5);
        copy (vec.begin (), vec.end (), deq.begin ());
        print (deq.begin (), deq.end ());
        list<int> lst (5);
        copy (deq.begin (), deq.end (), lst.begin ());
        print (lst.begin (), lst.end ());
        return 0;
    }
     list.cpp
    #include <list>
    #include "../day12/print.h"
    int main (void) {
        int ai1[] = {13, 45, 67, 88, 92, 107};
        int ai2[] = {22, 23, 37, 50, 69, 100, 109};
        list<int> li1 (ai1, ai1 + 6);
        list<int> li2 (ai2, ai2 + 7);
        print (li1.begin (), li1.end ());
        print (li2.begin (), li2.end ());
        li1.merge (li2);
        print (li1.begin (), li1.end ());
        print (li2.begin (), li2.end ());
        list<int>::iterator it = li1.begin ();
        li1.insert (it, 1000);
        it = li1.begin ();
        li1.insert (it, 2000);
        print (li1.begin (), li1.end ());
        return 0;
    }

    map.cpp

    #include <iostream>
    #include <map>
    using namespace std;
    class Candidate {
    public:
        Candidate (const char* name = "") :
            m_name (name), m_votes (0) {}
        const string& name (void) const {
            return m_name;
        }
        size_t votes (void) const {
            return m_votes;
        }
        void vote (void) {
            ++m_votes;
        }
    private:
        string m_name;
        size_t m_votes;
    };
    int main (void) {
        map<char, Candidate> mc;
        mc.insert (make_pair ('B', "赵云"));
        mc.insert (pair<char, Candidate> ('A', "张飞"));
        mc['D'] = "刘备";
        mc['E'] = "曹操";
        mc['C'] = "关羽";
        mc['D'] = "黄忠";
        mc.insert (pair<char, Candidate> ('A', "马超"));
        typedef map<char, Candidate>::iterator IT;
        typedef map<char, Candidate>::const_iterator CIT;
        for (size_t i = 0; i < 10; ++i) {
            for (CIT it=mc.begin (); it != mc.end (); ++it)
                cout << '(' << it->first << ')'
                    << it->second.name () << ' ';
            cout << endl << "请投下宝贵的一票:" << flush;
            char key;
            cin >> key;
            IT it = mc.find (key);
            if (it == mc.end ()) {
                cout << "此票作废!" << endl;
                continue;
            }
            it->second.vote ();
        }
        CIT win = mc.begin ();
        for (CIT it = mc.begin (); it != mc.end (); ++it){
            cout << it->second.name () << "获得"
                << it->second.votes () << "票。" << endl;
            if (it->second.votes () > win->second.votes ())
                win = it;
        }
        cout << "恭喜" << win->second.name () << "同学当选"
            "为首席保洁员!" << endl;
        return 0;
    }

    map2.cpp

    #include <iostream>
    #include <fstream>
    #include <map>
    #include <cstring>
    using namespace std;
    class CmpStr {
    public:
        bool operator() (const string& a,
            const string& b) const {
            return strcasecmp (a.c_str (),
                b.c_str ()) < 0;
        }
    };
    class A {
    public:
        A (int i) : m_i (i) {}
        bool operator< (const A& a) const {
            return m_i < a.m_i;
        }
        int m_i;
    };
    int main (int argc, char* argv[]) {
        if (argc < 2) {
            cerr << "用法:" << argv[0] << " <文件>"<<endl;
            return -1;
        }
        ifstream ifs (argv[1]);
        if (! ifs) {
            perror ("打开文件失败");
            return -1;
        }
        map<string, int, CmpStr> msi;
        string word;
        while (ifs >> word)
            ++msi[word];
        ifs.close ();
        for (map<string, int>::iterator it = msi.begin ();
            it != msi.end (); ++it)
            cout << it->first << " : " << it->second<<endl;
        map<A, int> mai;
        mai[A (100)] = 1000;
        mai[A (500)] = 5000;
        mai[A (300)] = 3000;
        mai[A (400)] = 4000;
        mai[A (200)] = 2000;
        map<A, int>::iterator it = mai.find (A (400));
        cout << it->second << endl;
        return 0;
    }
    mmap.cpp
    #include <iostream>
    #include <map>
    using namespace std;
    int main (void) {
        multimap<string, int> msi;
        msi.insert (make_pair ("张飞", 100000));
        msi.insert (make_pair ("赵云", 200000));
        msi.insert (make_pair ("张飞", 300000));
        msi.insert (make_pair ("关羽", 400000));
        msi.insert (make_pair ("赵云", 500000));
        msi.insert (make_pair ("关羽", 600000));
        typedef multimap<string, int>::const_iterator CIT;
        for (CIT it = msi.begin (); it != msi.end ();++it)
            cout << it->first << " : " << it->second<<endl;
        cout << "-------------" << endl;
        for (CIT it = msi.begin (); it != msi.end();++it){
            string key = it->first;
            CIT end = msi.upper_bound (key);
            int sum = 0;
            for (; it != end; ++it)
                sum += it->second;
            cout << key << " : " << sum << endl;
            --it;
        }
        return 0;
    }

    mset.cpp

    #include <iostream>
    #include <set>
    using namespace std;
    int main (void) {
        const char* candidates[] = {
            "张飞", "赵云", "关羽", "刘备", "曹操", NULL};
        multiset<string> ms;
        for (size_t i = 0; i < 10; ++i) {
            for (size_t i = 0; candidates[i]; ++i)
                cout << '(' << char ('A' + i) << ')'
                    << candidates[i] << ' ';
            cout << endl << "请投下您庄严的一票:" <<flush;
            char key;
            cin >> key;
            if (key < 'A' || 'E' < key) {
                cout << "此票作废!" << endl;
                continue;
            }
            ms.insert (candidates[key-'A']);
        }
        multiset<string>::iterator win = ms.begin ();
        for (multiset<string>::iterator it = ms.begin ();
            it != ms.end (); ++it) {
            cout << *it << "获得" << ms.count (*it)
                << "票。" << endl;
            if (ms.count (*it) > ms.count (*win))
                win = it;
            it = ms.upper_bound (*it);
            --it;
        }
        cout << "热烈祝贺" << *win << "当选垃圾长!"
            << endl;
        return 0;
    }
    oop.cpp
    #include <iostream>
    using namespace std;
    class Calculator {
    public:
        Calculator (char op) : m_op (op) {}
        double calculate (double x, double y) {
            switch (m_op) {
                case '+':
                    return x + y;
                case '-':
                    return x - y;
                case '*':
                    return x * y;
                case '/':
                    return x / y;
                default:
                    throw "无效运算符号!";
            }
        }
    private:
        char m_op;
    };
    int main (void) {
        cout << "左操作数:" << flush;
        double x;
        cin >> x;
        cout << "右操作数:" << flush;
        double y;
        cin >> y;
        cout << "运算符号:" << flush;
        char op;
        cin >> op;
        cout << "运算结果:" << Calculator (op).calculate (
            x, y) << endl;
        return 0;
    }

    pop.cpp

    #include <iostream>
    using namespace std;
    int main (void) {
        cout << "左操作数:" << flush;
        double x;
        cin >> x;
        cout << "右操作数:" << flush;
        double y;
        cin >> y;
        cout << "运算符号:" << flush;
        char op;
        cin >> op;
        double z;
        switch (op) {
            case '+':
                z = x + y;
                break;
            case '-':
                z = x - y;
                break;
            case '*':
                z = x * y;
                break;
            case '/':
                z = x / y;
                break;
            default:
                cout << "无效运算符号!" << endl;
                return -1;
        }
        cout << "运算结果:" << z << endl;
        return 0;
    }
    pqueue.cpp
    #include <iostream>
    #include <queue>
    using namespace std;
    class Student {
    public:
        Student (const string& name, float score) :
            m_name (name), m_score (score) {}
        void print (void) const {
            cout << m_name << "" << m_score << endl;
        }
        bool operator< (const Student& student) const {
            return m_score > student.m_score;
        }
    private:
        string m_name;
        float m_score;
    };
    class CmpInt {
    public:
        bool operator() (int a, int b) {
            return a > b;
        }
    };
    int main (void) {
    //    priority_queue<int> pqi;
        priority_queue<int, deque<int>, CmpInt> pqi;
        pqi.push (23);
        pqi.push (12);
        pqi.push (23);
        pqi.push (27);
        pqi.push (19);
        while (! pqi.empty ()) {
            cout << pqi.top () << ' ';
            pqi.pop ();
        }
        cout << endl;
        priority_queue<Student> pqs;
        pqs.push (Student ("张飞", 65));
        pqs.push (Student ("关羽", 60));
        pqs.push (Student ("赵云", 85));
        pqs.push (Student ("刘备", 95));
        pqs.push (Student ("曹操", 25));
        while (! pqs.empty ()) {
            pqs.top ().print ();
            pqs.pop ();
        }
        return 0;
    }

    queue.cpp

    #include <iostream>
    #include <queue>
    #include <list>
    using namespace std;
    int main (void) {
        queue<string, list<string> > qs;
        qs.push ("");
        qs.push ("");
        qs.push ("");
        qs.push ("");
        while (! qs.empty ()) {
            cout << qs.front ();
            qs.pop ();
        }
        cout << endl;
        return 0;
    }
    set.cpp
    #include <iostream>
    #include <set>
    #include <fstream>
    using namespace std;
    int main (void) {
        ifstream ifs ("test.txt");
        set<string> ss;
        string word;
        while (ifs >> word)
            ss.insert (word);
        ifs.close ();
        for (set<string>::iterator it = ss.begin ();
            it != ss.end (); ++it)
            cout << *it << endl;
        cout << "" << ss.size () << "个不同单词。"
            << endl;
        return 0;
    }

    sort.cpp

    #include <vector>
    #include <list>
    #include "../day12/print.h"
    template<typename type>
    void my_swap (type& a, type& b) {
        type c = a;
        a = b;
        b = c;
    }
    template<typename iterator>
    void my_sort (iterator begin, iterator end) {
        iterator p = begin;
        iterator last = end;
        --last;
        for (iterator i = begin, j = last; i != j;) {
            while (! (i == p || *p < *i))
                ++i;
            if (i != p) {
                my_swap (*p, *i);
                p = i;
            }
            while (! (j == p || *j < *p))
                --j;
            if (j != p) {
                my_swap (*p, *j);
                p = j;
            }
        }
        iterator it = begin;
        ++it;
        if (p != begin && p != it)
            my_sort (begin, p);
        it = p;
        ++it;
        if (it != end && it != last)
            my_sort (it, end);
    }
    template<typename iterator, typename comparator>
    void my_sort (iterator begin, iterator end,
        comparator cmp) {
        iterator p = begin;
        iterator last = end;
        --last;
        for (iterator i = begin, j = last; i != j;) {
            while (! (i == p || cmp (*p, *i)))
                ++i;
            if (i != p) {
                my_swap (*p, *i);
                p = i;
            }
            while (! (j == p || cmp (*j, *p)))
                --j;
            if (j != p) {
                my_swap (*p, *j);
                p = j;
            }
        }
        iterator it = begin;
        ++it;
        if (p != begin && p != it)
            my_sort (begin, p, cmp);
        it = p;
        ++it;
        if (it != end && it != last)
            my_sort (it, end, cmp);
    }
    class CmpInt {
    public:
        bool operator() (int a, int b) const {
            return a > b;
        }
    };
    int main (void) {
        int na[] = {13, 24, 22, 19, 44, 56, 88, 22};
        vector<int> vi (na, na + 8);
        list<int> li (na, na + 8);
        my_sort (na, na + 8);
        print (na, na + 8);
        my_sort (vi.begin (), vi.end ());
        print (vi.begin (), vi.end ());
        my_sort (li.begin (), li.end (), CmpInt ());
        print (li.begin (), li.end ());
        return 0;
    }

    stack.cpp

    #include <iostream>
    #include <stack>
    #include <vector>
    using namespace std;
    int main (void) {
        stack<string, vector<string> > ss;
        ss.push ("吃饭");
        ss.push ("喜欢");
        ss.push ("");
        while (! ss.empty ()) {
            cout << ss.top ();
            ss.pop ();
        }
        cout << endl;
        return 0;
    }
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    leetcode-----75. 颜色分类
    《面向机器智能的TensorFlow实践》_段菲学习资料
    事务及其ACID特性
    greenplum基本使用操作
    通过java api统计hive库下的所有表的文件个数、文件大小
    深度学习原理与TensorFlow实践_喻俨资料整理
    采集数据到HDFS
    《深入理解TensorFlow架构设计与实现原理》_彭靖田学习材料整理
    Too many open files
    子元素高度100%
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10028442.html
Copyright © 2011-2022 走看看