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”

  • 相关阅读:
    工作流
    工作流管理系统
    Domino(群组工作软件)
    Integer与int的区别(转)
    Java NIO和IO的区别(转)
    String、StringBuffer与StringBuilder之间区别(转)
    JAVA 是否会发生内存泄露(转)
    Java关键字final、static使用总结(转)
    数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)(转)
    Java多线程:用三个线程控制循环输出10次ABC
  • 原文地址:https://www.cnblogs.com/xaf-dfg/p/3727352.html
Copyright © 2011-2022 走看看