vector
vector的本质其实是一个动态数组,它是在堆中分配内存,元素连续存放,有保留内存。
优点:自动管理内存,拥有一段来连续的内存空间,并且起使位置不变。动态改变长度并随着元素的增大而则增大,减少大小,内存不会随之释放。(在扩大内存时。先扩大当前内存容量的两倍,如果还是不够,就扩大至足够大的容量)
缺点:因为内存空间是来连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都影响了vector的效率。
在尾部添加元素是固定时间,在头部或中间添加或删除元素是线性时间.
下面是一些vector容器的基本函数应用的例子:
front()返回头部元素的引用,可以当左值,
back() 返回稳步元素的引用,可以当左值
push_back() 添加元素,只能在尾部添加
pop_back() 移除元素,只能在尾部移除
删除元素
区间删除: v1.erase(v1.begin(),v1.begin()+3);
指定元素的删除: v1.erase(v1.begin()+3);
插入元素:
在指定位置插入元素10的拷贝 v1.insert(v1.begin()+3,10);
在指定位置插入3个元素11的拷贝 v1.insert(v1.begin(),3,11)
具体代码的实现:
int main(int argc,const char * argv[])
{
vector<int>v1;
//插入元素(尾插)
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
//迭代器遍历
for(std::vector<int>::iterator it=v1.begin();it!= v1.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
//修改头部元素的值(front()返回是引用,可以当左值)
v1.front()=44;
cout <<"头部元素"<<v1.front()<<endl;
//修改尾部元素的值(back()返回的是引用,可以当左值)
v1.back()=99;
cout<<"尾部元素"<<v1.back()<<endl;
v1.push_back(999);//从尾部插入元素;
//删除元素(从尾部)
v1.pop_back();
//迭代器遍历打印
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
//push_back 的强化
//push_back是在但年前的vector的内存末尾拷贝元素进容器。注意会产生浅拷贝,所以容器中的对象要支持拷贝操作。而且如果vector初始化了个数,而不是具体的值,push_back也只会在最后面追加。
vector<int> v2(10);
cout<<v2.size()<<endl;
v2.push_back(100);
cout<<v2.size()<<endl;
//遍历 结果是 0 0 0 0 0 0 0 0 0 100
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
运行结果如下图所示: