1 vector是啥玩意
(1)可以使用下标访问个别的元素
(2)迭代器可以按照不同的方式遍历
(3)可以在容器的末尾增加或者删除元素
2 容器大小和容器的容量区别
(1)大小是元素的个数,容量是分配的内存大小。vector::size()容器的大小 vecto::capacity返回容器值。
(2)每次重新分配内存都会影响程序的性能,所以一般分配的容量都打羽容器的大小。
3 vector中各种初始化方法

1 #include <vector> 2 #include <iostream> 3 using namespace std; 4 int main(){ 5 int a[7]={1,2,3,4,5,6,7}; 6 vector<int> ivector(a,a+7);/*vector的赋值并不可以像数组一样方便的用花括号方便 的完成赋值,这里借用了数组来初始化这个vector 7 初始化方式vector<elementType> intvec(begin,end);这样可以用起来看上去还是比较习惯的。*/ 8 vector<int>::iterator iter; 9 for (iter=ivector.begin();iter!=ivector.end();iter++){ 10 cout<<*iter<<" "; 11 } 12 cout<<endl; 13 ivector[5]=1; 14 /*单个vector的赋值,这个方式看上去还是和数组一样的 15 也可以这么写ivector.at(5)=1;但是就是不习惯 */ 16 cout<<ivector[5]<<endl<<ivector.size()<<endl; 17 for (iter=ivector.begin();iter!=ivector.end();iter++){ 18 cout<<*iter<<" "; 19 } 20 cout<<endl; 21 for(int i=0;i<5;i++){ 22 cout<<ivector[i]<<" "; 23 } 24 cout<<endl; 25 return 0; 26 }
foreach用法:

1 #include <vector> 2 #include <algorithm> 3 #include <iostream> 4 using namespace std; 5 6 void print(int n) 7 { 8 cout<<n<<" "; 9 } 10 11 int main(){ 12 int a[7]={1,2,3,4,5,6,7}; 13 vector<int> ivector(a,a+7); 14 vector<int>::iterator iter; 15 for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历 16 cout<<endl; 17 ivector[5]=1; 18 cout<<ivector[5]<<endl<<ivector.size()<<endl; 19 for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历 20 return 0; 21 }
vector中存入结构体而且排序,不会自动排序

1 #include<algorithm> 2 #include<vector> 3 #include<iostream> 4 using namespace std; 5 6 typedef struct rect{ 7 int id; 8 int length; 9 int width; 10 //重载<运算符 11 bool operator< (const rect &a) const{ 12 if(id!=a.id) 13 return id<a.id; 14 else{ 15 if(length!=a.length) 16 return length<a.length; 17 else 18 return width<a.width; 19 } 20 } 21 }Rect; 22 23 int main(){ 24 vector<Rect> vec;//vector存入结构体 25 //初始化 26 Rect rect; 27 rect.id=2; 28 rect.length=3; 29 rect.width=4; 30 //存入vector中 31 vec.push_back(rect); 32 33 rect.id=1; 34 rect.length=2; 35 rect.width=3; 36 vec.push_back(rect); 37 //进行输出 38 vector<Rect>::iterator it=vec.begin(); 39 cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; 40 sort(vec.begin(),vec.end()); 41 cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; 42 return 0; 43 }
vector中的查找

1 #include<algorithm> 2 #include<vector> 3 #include<iostream> 4 using namespace std; 5 int main(){ 6 vector<int> vec; 7 vec.push_back(1); 8 vec.push_back(2); 9 vec.push_back(3); 10 vec.push_back(4); 11 vec.push_back(5); 12 //进行查找 13 vector<int>::iterator iter=find(vec.begin(),vec.end(),3); 14 if ( iter==vec.end()) 15 cout << "Not found" << endl; 16 else 17 cout << "Found" << endl; 18 return 0; 19 }
vector中的删除

1 #include<algorithm> 2 #include<vector> 3 #include<iostream> 4 using namespace std; 5 int main(){ 6 vector<int> vec; 7 vec.push_back(1); 8 vec.push_back(2); 9 vec.push_back(3); 10 vec.push_back(4); 11 vec.push_back(5); 12 vector<int>::iterator iter=vec.begin(); 13 for(;iter!=vec.end();){ 14 if(*iter==3){ 15 //这里注意返回是迭代器哦 16 iter=vec.erase(iter); 17 }else{ 18 ++iter; 19 } 20 } 21 for(iter=vec.begin();iter!=vec.end();iter++){ 22 cout<<*iter<<" "; 23 } 24 return 0; 25 }
4 vector的内存管理与效率
关于STL容器,只要超过设置的最大值就会自动增长到足以容纳用户放进入的数据大小。
(1)内部采用动态数组方式实现。
(2)注意了,通过reverse申请特定大小的内存空间的时候总是按照指数边界来增大内部缓冲区。
当进行插入等操作的时候,如果内存不够用,这个时候会重新分配1.5-2倍的新内存空间,然后将内容复制过去。这个时候性能的确就会下降。
(3)使用“交换技巧”来修整vector过剩空间。也就是把它曾经最大的容量减少到它现在需要的容量。
vector<int>(ivec).swap(ivec).
(4)使用swap方法强行释放vector所占内存
例子

1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int main(){ 5 vector<int> iVec; 6 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 7 8 /*1个元素,容器容量为1*/ 9 iVec.push_back(1); 10 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 11 12 /*2个元素,容器容量为2*/ 13 iVec.push_back(2); 14 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 15 16 /*3个元素,容器容量为4*/ 17 iVec.push_back(3); 18 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 19 20 /*4个元素,容器容量为4*/ 21 iVec.push_back(4); 22 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 23 24 /*5个元素,容器容量为8*/ 25 iVec.push_back(5); 26 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 27 28 /*6个元素,容器容量为8*/ 29 iVec.push_back(6); 30 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 31 32 /*7个元素,容器容量为8*/ 33 iVec.push_back(7); 34 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 35 36 /*8个元素, 容器容量为8*/ 37 iVec.push_back(8); 38 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 39 40 /*9个元素, 容器容量为16*/ 41 iVec.push_back(9); 42 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 43 44 /* vs2005/8 容量增长不是翻倍的,如 45 9个元素 容量9 46 10个元素 容量13 */ 47 48 /* 测试effective stl中的特殊的交换 swap() */ 49 cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 50 vector<int>(iVec).swap(iVec); 51 52 cout<<"临时的vector<int>对象的大小为:"<<(vector<int>(iVec)).size()<<endl; 53 cout<<"临时的vector<int>对象的容量为: " <<(vector<int>(iVec)).capacity()<<endl; 54 cout<<"交换后,当前vector的大小为:"<<iVec.size()<<endl; 55 cout<<"交换后,当前vector的容量为:"<< iVec.capacity()<<endl; 56 57 return 0; 58 }
最后这里有点别扭,后面再看看。。。。加油骚年。。。。