序列式容器
一. vector :
vector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的
内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入。
vector的元素插入性能跟以下几个要素关系重大:
1. 插入的位置
头部插入:将所有元素后移,然后将新元素插入
中间插入:将插入点后面的元素后移,然后插入新元素
尾部插入:将新元素直接插入尾部
总结:
尾部插入无疑是最快的,头部插入最慢,中间插入次之,(尾部插入>中间插入>头部插入)
慢的原因:在于插入前要移动后面的所有元素。删除元素也是同样的道理。
2. 保留空间大小
如果插入元素是,空间不足将导致重新malloc以及一系列的内存拷贝。如果使用者能对容量有预期,
那么采用reserve()来预先分配内存,将大大的提高性能。
综述,vector适用于尾部插入,但是此时无法兼顾查找的性能,因为二分查找的vector要求重新排序,
或者要求vector在插入时就保持有序,这样就无法做到尾部插入。
但是vector作为动态数组的替代,已经足够优秀。
常用接口:
头文件: #include <vector>
vector<int> vec1;
vector<int> vec2(vec1);
vector<int> vec3(vec1.begin(),vec1.end());
vector<int> vec4(10);
vector<int> vec5(10,4);
vec1.push_back(100);
int size = vec1.size();
bool isEmpty = vec1.empty();
cout<<vec1[0]<<endl;
vec1.insert(vec1.end(),5,3);
vec1.pop_back();
vec1.erase(vec1.begin(),vec1.begin()+2);
cout<<(vec1==vec2)?true:false;
vector<int>::iterator iter = vec1.begin();
vector<int>::const_iterator c_iter = vec1.begin();
vec1.clear();
int length = vec1.size();
for(int i=0;i<length;i++)
{
cout<<vec1[i]<<" ";
}
cout<<endl;
vector<int>::iterator iter = vec1.begin();
for(;iter != vec1.e