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”