c++ stl vector的用法
2015-07-21 19:28
615 查看
原文转自:http://blog.csdn.net/nuptboyzhb/article/details/7482923
vector容器类的使用
郑海波 2012-4-20 南京
1. vector容器简介:
vector向量容器是一种随机访问的数组类型,它提供了对数组元素的快速访问、随机访问,以及在序列尾部快速、随机地插入和删除操作。它类似于数据结构中的队列、数组和堆栈等概念。
2. vector容器的定义
2.1 头文件 #include
2.2 命名空间 using namespace std;
2.3 举例:
vector m_vector;//定义一个string类型的向量容器
vector m_vector;//定义一个int类型的向量容器
vector m_vector(10);//创建了具有10个元素的容器,每个元素初始值为0
vector m_vector(10,5);//创建具有10个元素的容器,每个元素初始值为5
vector v1(5,’k’);
vector v2(v1);//v2和v1相同。
int iArray[]={11,13,19,23,27};
vector v(iArray,iArray+5);//用数组iArray创建容器。
3. vector容器的初始化
3.1 使用push_back()函数
如:
3.2 预先设定容器大小,使用[]运算符
vector容器大小的判断
主要是区分vector的几个函数,它们是size()、max_size()、capacity()
size:指容器当前存储了多少个元素
max_size:指容器的最大尺寸,一般是一个定值。但是不同的数据类型,有着不同的值。如int为1073741823,而double类型的向量容器的max_size为: 536870911;
capacity:指容器的容量,有reserve()函数确定;当没有reserve()函数确定时,它的值与size相同;
举例:
vector容器的遍历
5.1使用迭代器和循环相结合
1 张三
4 李四
2 王五
3 张三
5.2使用for_each()算法
5.3使用size()函数及[]运算法符和for循环相结合。
如:
vector容器的反向遍历
6.1使用迭代器和循环相结合
6.2使用for_each()算法
6.3 使用size()函数及[]运算法符和for循环相结合。
vector容器的删除操作
7.1调用pop_back()函数,删除向量容器尾部的一个元素;
7.2调用erase();函数,删除由迭代器指向的一个元素,或由迭代器指向的一个区间。
7.3 clear()函数,删除所有的元素
7.4用算法remove()
8. vector容器插入元素
第一个参数是迭代器类型,表示插入的位置,第二个参数表示参入的个数。第三个参数表示插入的元素。
另外一种表达形式:
vector容器中元素的查找
9.1.很显然,要用算法中的find函数或者find_if函数。当vector中存储的是普通类型,如int,double等时,find的第三个参数,可以是这种类型的一个值;当vector中存储的是一个类时,该类必须重载‘==’运算符。
9.2对于find_if,其第三个参数是一个函数名。而且这个函数的返回值必须为bool类型的,而且其参数必须是vector存储的类型的引用。
举例:
//文件名:CHAPTER6-8.cpp
与stu1相同的个数为1
ID大于2的个数有:4
10. vector容器中元素的排序
vector容器中元素的交换
如:swap(stu1,stu2);
那么就相当于stu1的值和stu2的值进行了交换。
如:将MySort修改如下,结果仍然不变。
当然,也可以进行容器的交换。
如:
vector容器类的使用
郑海波 2012-4-20 南京
1. vector容器简介:
vector向量容器是一种随机访问的数组类型,它提供了对数组元素的快速访问、随机访问,以及在序列尾部快速、随机地插入和删除操作。它类似于数据结构中的队列、数组和堆栈等概念。
2. vector容器的定义
2.1 头文件 #include
2.2 命名空间 using namespace std;
2.3 举例:
vector m_vector;//定义一个string类型的向量容器
vector m_vector;//定义一个int类型的向量容器
vector m_vector(10);//创建了具有10个元素的容器,每个元素初始值为0
vector m_vector(10,5);//创建具有10个元素的容器,每个元素初始值为5
vector v1(5,’k’);
vector v2(v1);//v2和v1相同。
int iArray[]={11,13,19,23,27};
vector 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]<<" "; } }
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
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; }
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; }
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]);
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; }
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);
相关文章推荐
- 哈希表系列:初探哈希(二),c语言实现
- OC语言数组
- C语言实现递归删除文件夹
- C语言基础6
- 12天学好C语言——记录我的C语言学习之路(Day 12)
- 12天学好C语言——记录我的C语言学习之路(Day 12)
- C++ 实现string的split
- 12天学好C语言——记录我的C语言学习之路(Day 11)
- 12天学好C语言——记录我的C语言学习之路(Day 11)
- POJ 2387
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
- 深入分析C++引用
- c语言中如何妙用do...while(0)语句
- C/C++中extern关键字详解
- Qt、C++小票打印----网口
- C语言取整方法总结
- C/C++ typedef用法
- 12天学好C语言——记录我的C语言学习之路(Day 10)
- 12天学好C语言——记录我的C语言学习之路(Day 10)
- c++书籍