//vector
//vector的遍历方式有两种:
1 for(int i = 0;i < a.size();++i)
2 for(iter = ivector.begin();iter != ivector.end();iter++)
3 for_each
//例程:
#include <vector>
#include <iostream>
void print(int n)
{
cout<<n<<endl;
}
int main()
{
int a[7] = {1,2,3,4,5,6,7};
vector<int> ivector(a,a+7);//用数组初始化vector,ivector(数组首元素地址,数组尾元素后一个地址)
vector<int>::iterator iter;//定义迭代器
for(iter = ivector.begin();iter != ivector.end();iter++)//输出容器内每一个元素的值
cout<<*iter<<endl;
ivector[5] = 1;//单个元素赋值类似数组
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for(int i = 0;i < 5;i++)
cout<<ivector[i]<<endl;//也可以像数组一样输出
for_each(ivector.begin(),ivector.end(),print);//for_each方式输出
return 0;
}
//vector中存放结构体时的排序,通过重载运算符的方式
#include<algorithm>
#include<vector>
#include<iostream>
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<Rect> vec;
Rect rect;
rect.id = 2;
rect.length = 3;
rect.width = 4;
vec.push_back(rect);
rect.id = 1;
rect.length = 3;
rect.width = 4;
vec.pushback(rect);
vector<Rect>::iterator it = vec.begin();
sort(vec.begin(),vec.end());//sort()内部默认用<进行升序排序
cout<<(*it).id << ' '<<(*it).length<< ' '<<(*it).width<<endl;
return 0;
}
//通过在结构体外定义函数来进行比较
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect
{
int id;
int length;
int width;
}Rect;
int cmp(Rect a,Rect b)
{
if(a.id != b.id)
return a.id < b.id;
else
{
if(a.length != b.length)
return a.length < b.length;
else
return a.width < b.width;
}
}
int main()
{
vector<Rect> vec;
Rect rect;
rect.id = 2;
rect.length = 3;
rect.width = 4;
vec.push_back(rect);
rect.id = 1;
rect.length = 3;
rect.width = 4;
vec.pushback(rect);
vector<Rect>::iterator it = vec.begin();
sort(vec.begin(),vec.end(),cmp);
cout<<(*it).id << ' '<<(*it).length<< ' '<<(*it).width<<endl;
return 0;
}
//vector的查找
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vector<int>::iterator iter = find(vec.begin(),vec.end(),3);//从第一个元素开始查找元素3
if(iter == vec.end())
cout<<"Not Found!";
else
cout<<"Found!";
return 0;
}
//vector的删除
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vector<int>::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;
}
vec.erase(vec.begin()+i,vec.end()+j);//删除第i+1到j个之间的元素(地址区间[i,j-1])
vec.pop_back();//删除最后一个元素
//vector的增加,三种函数原型
iterator insert(iterator loc,const TYPE &val);
//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
void insert(iterator loc,size_type num,const TYPE &val);
//在指定位置loc前插入num个值为val的元素
void insert(iterator loc,input_iterator start,input_iterator end);
//在指定位置loc前插入区间[start,end)的所有元素
//vector的查增删用法综合举例
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
void print(vector<int> v)
{
vector<int>::iterator iter=v.begin();
for(;iter != v.end();iter++)
cout<<*iter<<" ";
cout<<endl;
}
int main()
{
vector<int> v; //vector内有0元素
int values[] = {1,3,5,7};
v.insert(v.end(),values+1,values+3);//vector内元素:3,5
printf(v);
v.push_back(9); //vector内元素:3,5,9
printf(v);
v.erase(v.begin()+1); //vector内元素:3,9
printf(v);
v.insert(v.begin()+1,4); //vector内元素:3,4,9
printf(v);
v.insert(v.end()-1,4,6); //vector内元素:3,4,6,6,6,6,9
printf(v);
v.erase(v.begin()+1,v,begin()+3); //vector内元素:3,6,6,6,9
printf(v);
v.pop_back(); //vector内元素:3,6,6,6
printf(v);
v.clear(); //清空vector内元素,vector内有0元素
printf(v);
if(true == v.empty()) //判断vector是否为空
cout<<"null"<<endl;
return 0;
}
/*vectord的内存管理
1 reserve()函数提前设定容量大小
2 size()函数获得容器中有多少元素
3 capacity()函数获得容器在当前已分配的内存中共可容纳多少元素
若要获知容器中还剩多少空间,则用capacity() - size()
4 resize(Container::size_type n)强制把容器改为容纳n个元素
调用该函数后,size()会返回一个n
如果n小于当前大小,则容器尾部的元素会被销毁。
如果n大于当前大小,则新默认构造函数会添加到容器尾部。
如果n大于当前容量,在元素加入之前会重新分配。
5 reserve(Container::size_type n)强制容器把他的容量改为不小于n,n不小于当前所需大小
如果n小于当前容量,则vector会忽略它
总结:只要有元素需要插入但是容器容量不足的时候就会发生重新分配(包括他们维护的原始内存分配和回收,对象的拷贝和析构,迭代器、指针和引用的失效),这样会导致效率低下,因此最好在容器被构造之后,用reserve()尽快快容器的容量设置为足够大。
*/
参考《后台开发——核心技术与应用实践》
参考《后台开发——核心技术与应用实践》