zoukankan      html  css  js  c++  java
  • c++ stl 容器

    vector 在访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。vector<int> v;v.push_back(),在末尾添加一个元素,v.insert(p,val);//在迭代器p所指向的元素前插入值val。v.insert(p,n,val);//在迭代器p所指向的元素前面插入n个t。v.insert(p,s,e);//在迭代器p所指向的元素前插入迭代器s和e之前的元素。

    c++中关联容器都是自动排序的,map,set都是基于红黑树(自平衡的二叉查找树)实现的,

    默认排序方式是从小到大。

    所以元素类型需要可比较的,否则要自己定义排序规则。

        set<int> set1;
        set1.insert(3);
        set1.insert(2);
        cout<<*(set1.begin())<<endl;
        set1.insert(3);
        set1.insert(5);
        cout<<*(set1.begin())<<" size "<<set1.size()<<" maxsize "<<set1.max_size()<<endl;
        for (set<int>::iterator it=set1.begin();it!=set1.end();it++)
        {
            cout<<*it<<endl;
        }

    输出:2

    2 size 3 maxsize 1073741823

    2

    3

    5

    可以看出set按键值从小到大排序。

    同理map也是。

    关联容器按键 存储和读取元素。而顺序容器(vector,list,deque) 通过元素在容器中的位置存储和访问元素。

    vector容器的元素以连续的方式存放,当向vector容器添加新元素是,如果没有空间容纳新元素,则重新分配vector的存储空间,将旧空间中的元素复制到新存储空间,接着插入新元素,最后撤销旧存储空间。

    为了使vector的快速存储,其实际分配的容量要比当前所需空间多一些(预留额外存储区),用于添加新元素。

    map虽然不是连续存储,但是也可以用下表访问。

    map的下标操作符使用键来获取所关联的值,若下标访问不存在,则创建一个新的元素,并插入到map对象中,所关联的值采用值初始化:内置了类型初始化为0,类类型用默认构造函数初始化。

    set不可以用下标访问。

    容器的对象创建,其数据成员作为局部变量在栈中,其元素内容存储在堆中。可能有一个数据成员指向到堆中的一个内存空间地址。

    /**接上一段程序**/   
    cout<<sizeof(set1)<<" "<<set1.size()<<endl; set1.insert(1); cout<<sizeof(set1)<<" "<<set1.size()<<endl; cout<<sizeof(vect)<<" "<<vect.size()<<endl; vect.push_back(10); vect.insert(vect.begin()++,11); cout<<sizeof(vect)<<" "<<vect.size()<<endl;

    输出:

    20 3

    20 4

    20 5

    20 7

    这是container的实现问题,container肯定有些数据成员什么的,这可以是auto_ptr或者是普通的ptr指向一块内存区域,或者还有可能(应该)包括这个内存区域的长度,现在已经用的长度。sizeof操作符统计的只是数据成员(栈中)的长度,不会与堆里面的数据长度有关,所以会出现你看到的结果。即作sizeof操作的大小是相同的。而vector::size()操作,才反映了具体数据长度。

    Capacity求的是容器(vector)的容量。 该段来自于“http://blog.csdn.net/ljianhui/article/details/7729625”

  • 相关阅读:
    我对Web开发相关技术的认识过程
    JavaScript、JSP和Java之间的关系
    中断处理中的save_all、restore_all和iret
    实验五:Linux操作系统是如何工作的?破解操作系统的奥秘
    java CPU的乱序执行
    java缓存行对齐(缓存行二)
    解决ojdbc6升级ojdbc8中文乱码问题
    Caused by: java.lang.ClassNotFoundException: com.alibaba.dubbo.common.Version
    springSecurity5 重定向登录页面后 报错:尝试清除 Cookie.net::ERR_TOO_MANY_REDIRECTS status:200
    java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
  • 原文地址:https://www.cnblogs.com/xaf-dfg/p/3727352.html
Copyright © 2011-2022 走看看