zoukankan      html  css  js  c++  java
  • 深入学习c++--容器

    1. 简介

    1. 序列式容器: array, vector, deque, list, forward_list --- 数组 或者 指针实现
    2. 关联容器: set, map, multiset, multimap --- 二叉树 红黑树 O(logn)
    3. 无顺序容器: unordered_map, unordered_set, unordered_multimap, unordered_multiset

    补充拓展:
    4. stack
    5. queue
    6. priority_queue
    7. string
    8. bitset: (0或1)

    2. 元素要求

    1. 元素必须 可以被赋值操作来复制或者搬移(因为容器和算法对复写的要求)

    2. 元素必须可以被销毁

    3. 对于序列容器,元素 必须有默认的构造函数

    4. 对于某些操作, 元素需要定义 == 

    5. 对于关联容器,排序准则默认的是: <, std:less

    6. 无顺序容器,必须要提供一个 hash函数, 需要 == 

    7. stl容器里面 存的是元素的值,而不是引用

    8. 容器里面应该存放:

    • 基本元素
    • class : 满足上述

    9. stl的设计原则是效率优先,安全为次

    3. 容器的通用接口

    4. 基本使用

    4.1 array

    4.2 vector

    使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了

    C++11标准已经有这样的语法可以直接使用了,那就是emplace。vector有两个函数可以使用:emplace,emplace_back。emplace类似insert,emplace_back类似push_back。

    摘自:https://blog.csdn.net/windpenguin/article/details/75581552

    4.3 deque

     deque(双端队列)是一个动态数组,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。

    4.4 list

    list用自己内置的算法比较好

    4.6 forward_list

    不能随机访问

     

    4.7 set 

    频繁使用插入删除,可以考虑使用之。

    4.8 map

    emplace()构造生成的时候是以move的方式,来放到位置上去的

    b.emplace(std::pair<const int, std::string>(10, std::string("aga"));

    推荐用emplace来代替insert

    map的[]形式,必须有默认构造函数(不推荐)

    4.9 unordered_map(c++11)

    优点:效率很高,查找删除是常数算法

    缺点:空间上用的多,无序,适合一千万以下数据。

     

    #include <iostream>
    #include <set>
    #include <string>
    #include <algorithm>
    #include <unordered_map>
    using namespace std;
    
    class Position{
    public :
        int x() const { return m_x; }
        int y() const { return m_y; }
    private:
        int m_x = 0;
        int m_y = 0;        
    };
    
    // 使用unordered_map需要实现这个 
    namespace std {
        template<> struct hash<Position> {
            size_t operator() (const Position& p) const {   //对Postion做Hash ,模板类刻画 
                return p.x() + p.y();
            }
        };
    }
    
    class Person {
    private:
        int m_age;
        string m_name;
    public:
        Person(int a, string n) : m_age(a), m_name(move(n)) {    }
        int age() const {
            return m_age;
        }
        const string& name() const {
            return m_name;
        }
        void print() const { cout << m_age << " : " << m_name << endl; }
        void changeAge(int newAge) { m_age = newAge; }
        bool operator == (Person const& rhs) const {
            return m_age == rhs.m_age && m_name == rhs.m_name; 
        } 
        
    };
    
    void testUnordered_map()
    {
        using Group = std::unordered_map<Position, Person>;
        Group group;
    }
    //
    //struct CompareAge {
    //    template<typename T>
    //    bool operator()(const T& t1, const T& t2) const {
    //        return t1.age() < t2.age();
    //    } 
    //};
    
    int main()
    {
        testUnordered_map();
        
        return 0;
    }
  • 相关阅读:
    Smartform中表(table)的行间距设置
    ◆◆0Smartform中如何设置背景阴影色(Shading)
    ◆◆0如何在Smartforms中设置左右对齐
    如何在smartform中设置行间距
    ◆◆0如何在smartform中的table节点插入分页
    ◆◆0如何翻译smartform中的Text module
    如何在smartforms中插入复选框(checkbox)
    ◆◆0选择屏幕-SELECTION-SCREEN(一)
    科研呢喃-2
    遇到杠精,浪费时间
  • 原文地址:https://www.cnblogs.com/douzujun/p/10805673.html
Copyright © 2011-2022 走看看