前面已经简单介绍了顺序容器的定义以及一些操作,包括(添加,删除等),下面主要集中以代码的形式简单介绍一下相关用法,首先创建并初始化vector对象,一般有两大类:
1、分配指定数目元素,并初始化(分两种)
vector<int> ivec(10);
vector<int> ivec(10,1);
2、把vecotr对象初始化为一段元素的副本
int a[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> ivec(a,a+10);
把vector对象初始化为另一对象的副本
vector<int> ivec1(10,1);
vector<int> ivec2(ivec1);
例如:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> kvec(a,a+8);
//vector<int> ivec(10,1);
//vector<int> kvec(ivec);
for(vector<int>::iterator st=kvec.begin();st!=kvec.end();++st)
cout <<*st <<' ';
cout << endl;
return 0;
}
swap(c1,c2)属于赋值运算,交换c1,c2的元素,前提时c1,c2必须具有相同的类型.运用swap赋值通常比c1=c2.swap只是交换两个容器的内部数据结构,其元素本身并没有被交换,这也就意味着指向容器的迭代器,引用和指针在swap操作之后都不会失效.继而在执行swap后,可以通过该容器的迭代器访问交换后元素,如:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector<int> ivec1(10,1);
vector<int> ivec2(10,2);
swap(ivec1,ivec2);
for(vector<int>::iterator kk=ivec1.begin();kk!=ivec1.end();++kk)
cout << *kk << endl;
return 0;
}
resize(n)用于改变容器的大小,当将容器扩大时,则超出的部分默认初始化为0,若将容器缩小,则超出的元素将被删除,如:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
vector<int> ivec(a,a+10);
ivec.resize(20);
//ivec.resize(5);
for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test)
cout << *test ;
cout << endl;
return 0;
}
关于删除元素操作后迭代器会失效,因此一定要对迭代器重新赋值,更新迭代器。如果删除操作比较频繁,一般选择list。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
vector<int> ivec(a,a+10);
for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
if(*test%2==0){
test=ivec.erase(test);
--test;
}
}
for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
cout<< *test <<' ';
}
cout << endl;
return 0;
}
下面是某位仁兄写的,我觉得能更好地说明,所以一并贴出:
#include<iostream>
#include<list>
#include<vector>
#include<deque>
using namespace std;
void print(list<int>::iterator beg,list<int>::iterator end)
{
while(beg!=end)
{
cout<<*beg<<" ";
beg++;
}
cout<<endl;
}
void print(vector<int>::iterator beg,vector<int>::iterator end)
{
while(beg!=end)
{
cout<<*beg<<" ";
beg++;
}
cout<<endl;
}
void deleteelem(list<int>&lst,int flag)
{
int base=(flag%2==0?0:1);
list<int>::iterator head=lst.begin(),tail=lst.end();
while(head!=tail)
//这里不用更新指向容器尾端的迭代器
//因为list容器删除元素后没有出现元素的移动
{
if(*head%2==base)
head=lst.erase(head);
//巧妙利用函数返回值
else
head++;
}
}
void deleteelem(vector<int>&vec,int flag)
{
int base=(flag%2==0?0:1);
vector<int>::iterator head=vec.begin(),tail=vec.end();
while(head!=(tail=vec.end()))
//这里要更新一下指向容器尾端的迭代器
//因为vector容器删除元素后元素要顺序前移是迭代器失效
{
if(*head%2==base)
head=vec.erase(head);
else
head++;
}
}
int main()
{
int ia[10]={0,1,2,3,4,5,6,7,8,9};
list<int>odd(ia,ia+10);
vector<int>even(ia,ia+10);
print(odd.begin(),odd.end());
print(even.begin(),even.end());
deleteelem(odd,2);
print(odd.begin(),odd.end());
deleteelem(even,1);
print(even.begin(),even.end());
return 0;
}