• 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”

  • 相关阅读:
    POJ 1987
    POJ 3107
    POJ 1984
    POJ 1985
    【50】目标检测之目标定位
    【49】计算机视觉现状
    【48】数据扩充(Data augmentation)
    【47】迁移学习(Transfer Learning)
    【46】谷歌 Inception 网络简介Inception(2)
    【45】谷歌 Inception 网络简介Inception(1)
  • 原文地址:https://www.cnblogs.com/xaf-dfg/p/3727352.html
Copyright © 2020-2023  润新知