vector容器类的使用
郑海波 2012-4-20 南京
1. vector容器简介:
vector向量容器是一种随机访问的数组类型,它提供了对数组元素的快速访问、随机访问,以及在序列尾部快速、随机地插入和删除操作。它类似于数据结构中的队列、数组和堆栈等概念。
2. vector容器的定义
2.1 头文件 #include<vector>
2.2 命名空间 using namespace std;
2.3 举例:
vector<string> m_vector;//定义一个string类型的向量容器
vector<int> m_vector;//定义一个int类型的向量容器
vector<int> m_vector(10);//创建了具有10个元素的容器,每个元素初始值为0
vector<int> m_vector(10,5);//创建具有10个元素的容器,每个元素初始值为5
vector<char> v1(5,’k’);
vector<char> v2(v1);//v2和v1相同。
int iArray[]={11,13,19,23,27};
vector<int> v(iArray,iArray+5);//用数组iArray创建容器。
3. vector容器的初始化
3.1 使用push_back()函数
如:
#pragma warning(disable:4786)
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main()
{
vector<string> m_vector;
m_vector.push_back("B08020526");
m_vector.push_back("B08020888");
m_vector.push_back("南邮");
for (int i=0;i<3;i++)
{
cout<<m_vector[i]<<endl;
}
return 0;
}
3.2 预先设定容器大小,使用[]运算符
#pragma warning(disable:4786)
#include <vector>
#include <iostream>
using namespace std;
void main (void)
{
vector<int> Myvector;
Myvector.reserve(4);//限定大小为4
for(unsigned int i=0;i<4;i++)
{
Myvector[i]=i;
cout<<Myvector[i]<<" ";
}
}
4. vector容器大小的判断
主要是区分vector的几个函数,它们是size()、max_size()、capacity()
size:指容器当前存储了多少个元素
max_size:指容器的最大尺寸,一般是一个定值。但是不同的数据类型,有着不同的值。如int为1073741823,而double类型的向量容器的max_size为: 536870911;
capacity:指容器的容量,有reserve()函数确定;当没有reserve()函数确定时,它的值与size相同;
举例:
#pragma warning(disable:4786)
#include <iostream>
#include <vector>
using namespace std ;
typedef vector<int> INTVECTOR;
void main()
{
INTVECTOR thevector;
thevector.push_back(42) ;
cout << "size=" << thevector.size() << endl;
cout << "max_size=" << thevector.max_size()<< endl;
cout << "capacity=" << thevector.capacity() << endl;
thevector.reserve(1000);
cout << "size is: " << thevector.size() << endl;
cout << "max_size is: " << thevector.max_size()<< endl;
cout << "capacity is: " << thevector.capacity() << endl;
}
// size=1
// max_size=1073741823
// capacity=1
// size is: 1
// max_size is: 1073741823
// capacity is: 1000
5. vector容器的遍历
5.1使用迭代器和循环相结合
#pragma warning(disable:4786)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct student
{
int ID;
string name;
student(int i,string n)
{
ID=i;
name=n;
}
};
void main (void)
{
vector<student> Myvector;
vector<student>::iterator m_Iterator;//生成迭代器
student stu1(1,"张三");
student stu2(4,"李四");
student stu3(2,"王五");
student stu4(3,"张三");
Myvector.push_back(stu1);
Myvector.push_back(stu2);
Myvector.push_back(stu3);
Myvector.push_back(stu4);
for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)
{
cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;
}
}
1 张三
4 李四
2 王五
3 张三
5.2使用for_each()算法
#pragma warning(disable:4786)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>//for_each()
using namespace std;
struct student
{
int ID;
string name;
student(int i,string n)
{
ID=i;
name=n;
}
};
void OutFun(student &OutStu);//自定义输出函数
void main (void)
{
vector<student> Myvector;
student stu1(1,"张三");
student stu2(4,"李四");
student stu3(2,"王五");
student stu4(3,"张三");
Myvector.push_back(stu1);
Myvector.push_back(stu2);
Myvector.push_back(stu3);
Myvector.push_back(stu4);
for_each(Myvector.begin(),Myvector.end(),OutFun);
}
void OutFun(student &OutStu)
{
cout<<OutStu.ID<<" "<<OutStu.name<<endl;
}
5.3使用size()函数及[]运算法符和for循环相结合。
如:
for (int i=0;i<Myvector.size();i++)
{
cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;
}
6. vector容器的反向遍历
6.1使用迭代器和循环相结合
vector<student>::reverse_iterator m_Iterator;//一定要将迭代器声明为反向迭代器
……..
for (m_Iterator=Myvector.rbegin();m_Iterator!=Myvector.rend();m_Iterator++)
{
cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;
}
6.2使用for_each()算法
for_each(Myvector.rbegin(),Myvector.rend(),OutFun);
6.3 使用size()函数及[]运算法符和for循环相结合。
for (int i=Myvector.size()-1;i>=0;i--)
{
cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;
}
7. vector容器的删除操作
7.1调用pop_back()函数,删除向量容器尾部的一个元素;
7.2调用erase();函数,删除由迭代器指向的一个元素,或由迭代器指向的一个区间。
Myvector.erase(Myvector.begin()+1);
Myvector.erase(Myvector.begin(),Myvector.end()-1);
7.3 clear()函数,删除所有的元素
7.4用算法remove()
8. vector容器插入元素
Myvector.insert(Myvector.begin()+2,2,stu4);
第一个参数是迭代器类型,表示插入的位置,第二个参数表示参入的个数。第三个参数表示插入的元素。
另外一种表达形式:
student stu_array[4]={stu1,stu2,stu3,stu4};
Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);
9. vector容器中元素的查找
9.1.很显然,要用算法中的find函数或者find_if函数。当vector中存储的是普通类型,如int,double等时,find的第三个参数,可以是这种类型的一个值;当vector中存储的是一个类时,该类必须重载‘==’运算符。
9.2对于find_if,其第三个参数是一个函数名。而且这个函数的返回值必须为bool类型的,而且其参数必须是vector存储的类型的引用。
举例:
//文件名:CHAPTER6-8.cpp
#pragma warning(disable:4786)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>//for_each()
using namespace std;
class student
{
public:
int ID;
string name;
student(int i,string n)
{
ID=i;
name=n;
}
bool operator == (const student& ob)
{
if (ob.ID==ID&&ob.name==name)
{
return true;
}
else
{
return false;
}
}
};
void OutFun(student &OutStu);
bool ForFindFun(student &OutStu);
void main (void)
{
vector<student> Myvector;
vector<student>::iterator m_Iterator;
student stu1(1,"张三");
student stu2(4,"李四");
student stu3(2,"王五");
student stu4(3,"赵六");
Myvector.push_back(stu1);
Myvector.push_back(stu2);
Myvector.push_back(stu3);
Myvector.push_back(stu4);
for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)
{
cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;
}
cout<<"----------------------------------------"<<endl;
for_each(Myvector.rbegin(),Myvector.rend(),OutFun);
cout<<"----------------------------------------"<<endl;
/*m_Iterator=remove(Myvector.begin(),Myvector.end(),&stu2);*/
Myvector.insert(Myvector.begin()+2,2,stu4);
for_each(Myvector.begin(),Myvector.end(),OutFun);
// student stu_array[4]={stu1,stu2,stu3,stu4};
// Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);
// for_each(Myvector.begin(),Myvector.end(),OutFun);
int var_count(0);
var_count=count(Myvector.begin(),Myvector.end(),stu1);
cout<<"\n与stu1相同的个数为"<<var_count<<endl;
var_count=count_if(Myvector.begin(),Myvector.end(),ForFindFun);
cout<<"\nID大于2的个数有:"<<var_count<<endl;}
void OutFun(student &OutStu)
{
cout<<OutStu.ID<<" "<<OutStu.name<<endl;
}
bool ForFindFun(student &OutStu)
{
if (OutStu.ID>2)
{
return true;
}
return false;
}//输出结果为:
1 张三
4 李四
2 王五
3 赵六
----------------------------------------
3 赵六
2 王五
4 李四
1 张三
----------------------------------------
1 张三
4 李四
3 赵六
3 赵六
2 王五
3 赵六
与stu1相同的个数为1
ID大于2的个数有:4
10. vector容器中元素的排序
//文件名:CHAPTER6-8.cpp
#pragma warning(disable:4786)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>//for_each()
using namespace std;
class student
{
public:
int ID;
string name;
student(int i,string n)
{
ID=i;
name=n;
}
bool operator == (const student& ob)
{
if (ob.ID==ID&&ob.name==name)
{
return true;
}
else
{
return false;
}
}
};
void OutFun(student &OutStu);
bool ForFindFun(student &OutStu);
bool MySort(student &stuE,student&Temp_stu);
void main (void)
{
vector<student> Myvector;
vector<student>::iterator m_Iterator;
student stu1(1,"张三");
student stu2(4,"李四");
student stu3(2,"王五");
student stu4(3,"赵六");
Myvector.push_back(stu1);
Myvector.push_back(stu2);
Myvector.push_back(stu3);
Myvector.push_back(stu4);
for (m_Iterator=Myvector.begin();m_Iterator!=Myvector.end();m_Iterator++)
{
cout<<m_Iterator->ID<<" "<<m_Iterator->name<<endl;
}
cout<<"----------------------------------------"<<endl;
for_each(Myvector.rbegin(),Myvector.rend(),OutFun);
cout<<"----------------------------------------"<<endl;
m_Iterator=remove(Myvector.begin(),Myvector.end(),stu2);
Myvector.insert(Myvector.begin()+2,2,stu4);
for_each(Myvector.begin(),Myvector.end(),OutFun);
// student stu_array[4]={stu1,stu2,stu3,stu4};
// Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);
// for_each(Myvector.begin(),Myvector.end(),OutFun);
int var_count(0);
var_count=count(Myvector.begin(),Myvector.end(),stu1);
cout<<"\n与stu1相同的个数为"<<var_count<<endl;
var_count=count_if(Myvector.begin(),Myvector.end(),ForFindFun);
cout<<"\nID大于2的个数有:"<<var_count<<endl;
cout<<"---------------整理结果--------------------"<<endl;
for (int i=Myvector.size();i>0;i--)
{
sort(Myvector.begin(),Myvector.end(),MySort);
}
for_each(Myvector.begin(),Myvector.end(),OutFun);
}
void OutFun(student &OutStu)
{
cout<<OutStu.ID<<" "<<OutStu.name<<endl;
}
bool ForFindFun(student &OutStu)
{
if (OutStu.ID>2)
{
return true;
}
return false;
}
bool MySort(student &stuE,student&Temp_stu)
{
// student temp(0,"");
if (stuE.ID>Temp_stu.ID)
{
student temp(stuE.ID,stuE.name);
stuE.ID=Temp_stu.ID;
stuE.name=Temp_stu.name;
Temp_stu.ID=temp.ID;
Temp_stu.name=temp.name;
}
return true;
}
11. vector容器中元素的交换
如:swap(stu1,stu2);
那么就相当于stu1的值和stu2的值进行了交换。
如:将MySort修改如下,结果仍然不变。
bool MySort(student &stuE,student&Temp_stu)
{
// student temp(0,"");
if (stuE.ID>Temp_stu.ID)
{
swap(stuE,Temp_stu);
}
return true;
}
当然,也可以进行容器的交换。
如:
vector<int > v1;
vector<int > v2;
v1.swap(v2);
vector容器类的使用[c++ stl]
原创
©著作权归作者所有:来自51CTO博客作者ali莫川的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:MFC扫雷外挂的编程
下一篇:matlab GUI界面编程总结
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C++:STL模板类vector
需头文件:vector#include 要创建vector对象,可使用通常的vector来指定类型,另外,vector模板使用动态内存分配,因此可以初始化参数来指
vector for_each sort random_shuffle swap -
【C++】STL:vector
为什么在3.1的reserve实现中,我使用了赋值重载,而没有使用
c++ 算法 开发语言 迭代器 数据 -
C++ STL vector详情
文章目录一、vector声明及初始化二、vector基本操作三、算法vector是表示可变大小
c++ 数组 存储空间 初始化 -
C++ STL-vector
vector, 变长数组,倍增的思想。empty() 返回是否为空。size() 返回元素个数。clear() 清空。支持比较运算,按字典序。
c++ 算法 数据结构 #include 数组 -
C++ STL容器vector篇(四) vector容器交换, 预留空间
-
#include i++ 尾插法