c++中stl----vector
阅读原文时间:2023年10月09日阅读:5

1 vector是啥玩意

(1)可以使用下标访问个别的元素

(2)迭代器可以按照不同的方式遍历

(3)可以在容器的末尾增加或者删除元素

2 容器大小和容器的容量区别

(1)大小是元素的个数,容量是分配的内存大小。vector::size()容器的大小 vecto::capacity返回容器值。

(2)每次重新分配内存都会影响程序的性能,所以一般分配的容量都打羽容器的大小。

3 vector中各种初始化方法

#include
#include
using namespace std;
int main(){
int a[7]={1,2,3,4,5,6,7};
vector ivector(a,a+7);/*vector的赋值并不可以像数组一样方便的用花括号方便 的完成赋值,这里借用了数组来初始化这个vector
初始化方式vector intvec(begin,end);这样可以用起来看上去还是比较习惯的。*/
vector::iterator iter;
for (iter=ivector.begin();iter!=ivector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
ivector[5]=1;
/*单个vector的赋值,这个方式看上去还是和数组一样的
也可以这么写ivector.at(5)=1;但是就是不习惯 */
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for (iter=ivector.begin();iter!=ivector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<ivector[i]<<" ";
}
cout<<endl;
return 0;
}

foreach用法:

#include
#include
#include
using namespace std;

void print(int n)
{
cout<<n<<" ";
}

int main(){
int a[7]={1,2,3,4,5,6,7};
vector ivector(a,a+7);
vector::iterator iter;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
cout<<endl;
ivector[5]=1;
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
return 0;
}

vector中存入结构体而且排序,不会自动排序

#include
#include
#include
using namespace std;

typedef struct rect{
int id;
int length;
int width;
//重载<运算符
bool operator< (const rect &a) const{
if(id!=a.id)
return id<a.id;
else{
if(length!=a.length)
return length<a.length;
else
return width<a.width;
}
}
}Rect;

int main(){
vector vec;//vector存入结构体
//初始化
Rect rect;
rect.id=2;
rect.length=3;
rect.width=4;
//存入vector中
vec.push_back(rect);

 rect.id=1;  
 rect.length=2;  
 rect.width=3;  
 vec.push\_back(rect);  
 //进行输出  
 vector<Rect>::iterator it=vec.begin();  
 cout<<(\*it).id<<' '<<(\*it).length<<' '<<(\*it).width<<endl;  
 sort(vec.begin(),vec.end());  
 cout<<(\*it).id<<' '<<(\*it).length<<' '<<(\*it).width<<endl;  
 return 0;  

}

vector中的查找

#include
#include
#include
using namespace std;
int main(){
vector vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
//进行查找
vector::iterator iter=find(vec.begin(),vec.end(),3);
if ( iter==vec.end())
cout << "Not found" << endl;
else
cout << "Found" << endl;
return 0;
}

vector中的删除

#include
#include
#include
using namespace std;
int main(){
vector vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
vector::iterator iter=vec.begin();
for(;iter!=vec.end();){
if(*iter==3){
//这里注意返回是迭代器哦
iter=vec.erase(iter);
}else{
++iter;
}
}
for(iter=vec.begin();iter!=vec.end();iter++){
cout<<*iter<<" ";
}
return 0;
}

4 vector的内存管理与效率

关于STL容器,只要超过设置的最大值就会自动增长到足以容纳用户放进入的数据大小。

(1)内部采用动态数组方式实现。

(2)注意了,通过reverse申请特定大小的内存空间的时候总是按照指数边界来增大内部缓冲区。

当进行插入等操作的时候,如果内存不够用,这个时候会重新分配1.5-2倍的新内存空间,然后将内容复制过去。这个时候性能的确就会下降。

(3)使用“交换技巧”来修整vector过剩空间。也就是把它曾经最大的容量减少到它现在需要的容量。

vector(ivec).swap(ivec).

(4)使用swap方法强行释放vector所占内存

例子

#include
#include
using namespace std;
int main(){
vector iVec;
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*1个元素,容器容量为1\*/  
 iVec.push\_back(1);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*2个元素,容器容量为2\*/  
 iVec.push\_back(2);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*3个元素,容器容量为4\*/  
 iVec.push\_back(3);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*4个元素,容器容量为4\*/  
 iVec.push\_back(4);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*5个元素,容器容量为8\*/  
 iVec.push\_back(5);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*6个元素,容器容量为8\*/  
 iVec.push\_back(6);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*7个元素,容器容量为8\*/  
 iVec.push\_back(7);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 

 /\*8个元素, 容器容量为8\*/  
 iVec.push\_back(8);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\*9个元素, 容器容量为16\*/  
 iVec.push\_back(9);  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;

 /\* vs2005/8 容量增长不是翻倍的,如  
 9个元素   容量9  
 10个元素 容量13 \*/

 /\* 测试effective stl中的特殊的交换 swap() \*/  
 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;  
 vector<int>(iVec).swap(iVec);

 cout<<"临时的vector<int>对象的大小为:"<<(vector<int>(iVec)).size()<<endl;  
 cout<<"临时的vector<int>对象的容量为: " <<(vector<int>(iVec)).capacity()<<endl;  
 cout<<"交换后,当前vector的大小为:"<<iVec.size()<<endl;  
 cout<<"交换后,当前vector的容量为:"<< iVec.capacity()<<endl;

 return 0;  

}

最后这里有点别扭,后面再看看。。。。加油骚年。。。。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章