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”

 

posted @ 2014-05-14 11:26  xaf_dfg  阅读(236)  评论(0编辑  收藏  举报