前言
关于学习、了解vector相关方法的定义及功能,官方参考手册是最好的地方,权威、客观、简明扼要,没有歧义。这是官方文档的地址:C++官方文档
vector构造方法
vector构造方法共有以下几种:
vector<int>first;//创建一个空的int类容器first
vector<int>second(2);//创建一个长度为2的int类型容器second
vector<int>third(3,4);//创建一个容器,容器初始包括3个4
vector<int>fourth=third;//创建一个third的副本
vector<int>fifth(fourth.begin(),fourth.end());//将容器fourth从第begin()指向成员开始到指向位置的前一个的成员为止赋值给
fifth,这条语句等同于vector<int>fifth=fourth
顺带一提,对于整形一维数组nums,可以有:
vector<int>example(nums,nums+sizeof(nums)/sizeof(nums[0]));
不可以发生:
vector<int>example=nums;
归根结底,二者是不同的类型。
关于构造方法的测试代码,如下:
vector<int>first;
cout << "容器first:" << endl;
cout << "长度:" << first.size()<< "容器内成员:";
for (std::vector<int>::iterator it = first.begin(); it <first.end(); ++it)
cout << *it << " ";
cout << endl;
vector<int>second(2);
cout << "容器second:" << endl;
cout << "长度:" << first.size() << "容器内成员:";
for (std::vector<int>::iterator it=second.begin(); it < second.end(); it++)
cout << *it << " ";
cout << endl;
vector<int>third(3, 4);
cout << "容器third:" << endl;
cout << "长度:" << third.size() << "容器内成员:";
for (std::vector<int>::iterator it=third.begin(); it < third.end(); it++)
cout << *it << " ";
cout << endl;
vector<int>fourth = third;
cout << "容器fourth:" << endl;
cout << "长度:" << fourth.size() << "容器内成员:";
for (std::vector<int>::iterator it=fourth.begin(); it < fourth.end(); it++)
cout << *it << " ";
cout << endl;
vector<int>fifth(fourth.begin(), fourth.end());
cout << "容器fifth:" << endl;
cout << "长度:" << first.size() << "容器内成员:";
for (std::vector<int>::iterator it=fifth.begin(); it < fifth.end(); it++)
cout << *it << " ";
cout << endl;
结果如下:
capacity与size设置与修改的相关方法
vector容器大小设置修改相关方法包括以下几种:
unsigned int size();//返回容器内成员数量
unsigned int capacity();//返回容器当前拥有的内存大小可以存放的成员数量
void resize();//重设size大小,保持原有成员相对位置不动
bool empty(); //如果size值为0返回true,else return false;
bool reserve(unsigned int n);//重设capacity值,必须条件:n>=capacity
voidshrink_to_fit();优雅行为,we don't care
关于size与capacity的区别:
如果了解c语言中动态申请内存的方法,会清楚c中动态申请大小为size的内存之后,不可在原有已申请内存基础上扩展内存,如果有新的更大范围的超过size大小n的内存需要必须重新随机申请一块新的最小(size+n)的地址,实际上vector类封装了这一操作。
以下代码为例:
vector<int> e;
int i;
cout << "size:" << e.size() << endl;
cout << "capacity" << e.capacity() << endl;
e.resize(10);
cout << "resize" << endl;
cout << "size:" <<e.size() << endl;
cout << "capacity"<<e.capacity() << endl;
e.push_back(1);
cout << "add one int" << endl;
cout << "size:" << e.size() << endl;
cout <<"capacity"<< e.capacity() << endl;
e.resize(100);
cout << "size:" << e.size() << endl;
cout << "capacity" << e.capacity() << endl;
e.push_back(1);
cout << "add one int" << endl;
cout << "size:" << e.size() << endl;
cout << "capacity" << e.capacity() << endl;
e.resize(500);
cout << "size:" << e.size() << endl;
cout << "capacity" << e.capacity() << endl;
e.insert(e.begin(),2,1);
cout << "insert two int" << endl;
cout << "size:" << e.size() << endl;
cout << "capacity" << e.capacity() << endl;
cout <<"maxsize"<< e.max_size() << endl;
运行结果为:
由结果可知,vector构造时默认capacity与size大小相同,但当进行insert与push操作导致capacity大小不够时,重新申请一片(capacity+capacity/2)大小的内存区域并将首地址并返回给所申请的指针变量,所以在上例中,capacity+=capacity/2;size+=n;
vector中iterator相关方法
关于对vector进行迭代操作时可能用到的方法包括:
begin()方法:返回保存第一个成员的地址的指针;
end()方法:返回保存最后一个成员的后一个地址的指针;
cbegin()方法:返回保存第一个成员的地址的常量指针;
cend()方法:返回保存最后一个成员地址的常量指针
以实际应用以上方法的代码来了解或许更为直观,以下为测试代码:
vector<int> ex(10);
int i = 0;
while (i < 10)
{
ex[i] = i;
i++;
}
cout << "容器ex的大小为:" << ex.size() << endl << "成员为:";
for (std::vector<int>::iterator it = ex.begin(); it < ex.end(); it++)
cout << *it<<' ';
cout << endl;
结果如下:
试想如果将上面代码中的it=ex.begin()换成ex.cbegin()会发生什么?编译器会直接报错提示不允许将const *修饰变量赋值给其他。
vector成员访问相关方法
vector类容器也可以使用[]符号直接访问元素所在地址,就像数组一样。也能够进行多维数组的相关操作。
C语言中动态申请二位数组空间使用类似下边的语句:
int **e;
e=(int**)malloc(sizeof(int*)*n);
int i=0;
while(i<n)
{
e[i]=(int *)malloc(sizeof(int)*m);
int j=0;
while(j<m)
{
e[i][j]=j;
j++;
}
i++;
}
printf("第n行m列元素的为%d”,e[n-1][m-1]);
以上代码的功能是申请一个n行m列的integer二维数组并初始化,而使用C++大概需要进行如下几种操作,可以看出某种程度的类似;
vector<vector<int>> e(n,vector<int>(m));
for (auto& i : e)
{
int k = 0;
for (auto& j : i)
{
j = k;
k++;
}
}
cout<<"第n行m列元素的为”<<e[n-1][m-1];
也可以:
vector<vector<int>> e;
e.resize(n);
for (auto& i : e)
{
n.resize(m);
int j=0;
for (auto& w : m)
{
w = j;
j++;
}
}
cout<<"第n行m列元素的为”<<e[n-1][m-1];
也可以:
vector<vector<int>> e;
e.resize(n);
for (int i=0;i<n;i++)
{
e[i].resize(m);
for (int j=0;j<m;j++)
{
e[i][j]= j;
}
}
cout<<"第n行m列元素的为”<<e[n-1][m-1];
vector容器的成员访问方法还包括at()、front()、back();
从单词释义就可以知道这三个方法的对应功能为:访问第i个成员、访问最前面也就是第一个成员、访问最后一个成员。
以下为测试代码:
vector<int> e;
e.resize(5);
int i = 0;
for (auto& n : e)
{
n = i;
i++;
}
cout << "容器内成员:" ;
for (auto& n : e)
cout << n << ' ';
cout << endl;
cout << "第1个成员为" << e.at(1) << endl;
e.at(1) = 999;
cout << "第1个成员为" << e.at(1) << endl;
cout << "第0个成员为" << e.front() << endl;
cout << "最后一个成员为" << e.back() << endl;
运行结果为:
vector成员修改相关方法
vector的修改相关方法主要包括以下几种:
assign():对容器进行拷贝、赋值;重载为以下两种形式:
void assign(int n,val m);//将容器大小设置为n,每个成员的值为val;
void assign(iterator begin,iterator end);//将begin~end-1共计(end-begin)个元素拷贝至容器第0至第(end-begin-1),
size设置为(end-begin);
push_back()与pop_back():容器尾部追加成员与移除容器尾部成员,功能单一很容易理解;
void pushback(val n);//容器尾部插入成员n;
void pop_back();//移除容器尾部成员;
insert():向容器指定位置加入成员,其他成员保持相对位置;
void insert(iterator it,int n,int m);//在容器it位置插入n个m,其他成员保持相对位置后移
void insert(iterator it,iterator begin,iterator end);//it位置插入begin~(end-1)个成员,其他成员同上~;
erase():删除成员
void erase(iterator it);//删除容器内it指向成员;
void erase(iterator it,it+n);//删除容器内it~(it+n-1)指向的共n-1个元素;
END