C++STL——vector
一、相关定义
vector
- 数组
- 随机访问迭代器
- 快速随机访问元素
- 尾部进行快速随机地插入和删除操作
特征:
- 能够存放任意类型;
- 访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成;
- 查找特定值的元素所处的位置或是在vector中插入元素则是线性时间复杂度。
二、vector
【使用前提】
- #include <vector>
- using namespace std;
【函数列表】
- vector<ElemType> c; 创建一个空的vector
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创建容器。
- c.push_back(elem); 在容器最后位置添加一个元素elem
#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;
}
- c.pop_back(); 删除容器最后位置处的元素
- c.at(index); 返回指定index位置处的元素
- c.begin(); 返回指向容器最开始位置数据的指针
- c.end(); 返回指向容器最后一个数据单元的指针+1
- c.front(); 返回容器最开始单元数据的引用
- c.back(); 返回容器最后一个数据的引用
- c.max_size(); 返回容器的最大容量
- c.size(); 返回当前容器中实际存放元素的个数
- c.capacity(); 同c.size()
#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
- c.resize(); 重新设置vector的容量
- c.reserve(); 同c.resize()
#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]<<" ";
}
}
- c.erase(p); 删除迭代器p指向的数据,返回指向下一个数据位置的指针(迭代器)
- c.erase(begin,end) 删除迭代器指向的begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)
Myvector.erase(Myvector.begin()+1);
Myvector.erase(Myvector.begin(),Myvector.end()-1);
- c.clear(); 清除所有数据
- c.rbegin(); 将vector反转后的开始指针返回(其实就是原来的end-1)
- c.rend(); 将vector反转后的结束指针返回(其实就是原来的begin-1)
- c.empty(); 判断容器是否为空,若为空返回true,否则返回false
- c1.swap(c2); 交换两个容器中的数据
- c.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针
- c.insert(p,n,elem); 在位置p插入n个elem数据,无返回值
Myvector.insert(Myvector.begin()+2,2,stu4);
//第一个参数是迭代器类型,表示插入的位置;第二个参数表示参入的个数;第三个参数表示插入的元素。
- c.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值
student stu_array[4]={stu1,stu2,stu3,stu4};
Myvector.insert(Myvector.begin()+2,&stu_array[0],&stu_array[3]);
【vector的遍历】
//使用迭代器和循环相结合
#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 张三
//使用for_each()算法
#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;
}
//使用size()函数及[]运算法符和for循环相结合。
for(int i=0;i<Myvector.size();i++){
cout<<Myvector[i].ID<<" "<<Myvector[i].name<<endl;
}
【其他常用操作】
排序
#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;
}
查找
1.很显然,要用算法中的find函数或者find_if函数。当vector中存储的是普通类型,如int,double等时,find的第三个参数,可以是这种类型的一个值;
当vector中存储的是一个类时,该类必须重载‘==’运算符。
2对于find_if,其第三个参数是一个函数名。而且这个函数的返回值必须为bool类型的,而且其参数必须是vector存储的类型的引用。
举例:
#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
二维容器
声明:
- vector <vector <int> > arrayTwo2(3);
解释:
- arrayTwo可以保存3个向量,向量的长度是可以改变的;
- arrayTwo[i]返回的是第i个向量,同理,arrayTwo[i][j]返回的是第i个向量中的第j个元素;
vector<vector<int> > arrayTwo(3);
arrayTwo[1][2]=9; //Error,原因就是你没有指定向量的大小。
arrayTwo[1].push_back(9); //正确,但是好象不太爽。就不能用operator[]吗?
for(int i=0;i<3;i++) //这样,你就定义了一个3X3的数组了(另一个3在声明时定义的)。而且你可以随时改变它的大小。
array2[i].resize(3);
例子:
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector<vector<int> > array(3);
for(int i=0;i<3;i++)
array[i].resize(3);//设置数组的大小3X3
//现在你可以和使用数组一样使用这个vector
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
array[i][j]=(i*j);
//输出
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
cout<<array[i][j]<<" ";
cout<<endl;
}
array.resize(5);
arry[3].resize(3);
arry[4].resize(3);
//现在是5X3的数组了
for(int i=0;i<5;i++)
for(int j=0;j <3;j++)
array[i][j]=(i*j);
for(int i=0;i <5;i++){
for(int j=0;j <3;j++)
cout<<array[i][j]<<" ";
cout<<endl;
}
}
C++STL——vector的更多相关文章
- C++ STL vector容器学习
STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...
- STL vector
STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL vector+sort排序和multiset/multimap排序比较
由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...
- STL vector 用法介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- STL vector使用方法介绍
介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- stl——vector详解
stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...
- C++STL vector详解(杂谈)
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- C++ stl vector介绍
转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...
- 浅谈C++ STL vector 容器
浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...
随机推荐
- Java数据结构的实现
1.基于数组的链表 package array; import java.util.Arrays; /** * 基于数组的链表 * * @author 王彪 * */ public class MyA ...
- React Native 中组件的生命周期(转)
概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...
- js日期相减得到分钟数
const date1 = new Date(fieldsValue.examStartTime); const date2 = new Date(fieldsValue.examEndTime); ...
- 免安装版Tomcat9中间件的安装
[环境准备] OS版本:Windows10.64位 Tomcat版本:apache_tomcat9.0.7.zip免安装版 [彻底卸载已安装的Tomcat中间件] 01:由于是免安装版本,因此直接删除 ...
- 快速创建显示数字数据的动画——CountUp.js
由于项目需求,需要写一个数字增/减量的动画特效,最后找到了CountUp.js CountUp.js是一个无依赖,轻量级的JavaScript“类”,可用于快速创建以更有趣的方式显示数字数据的动画. ...
- Linux下NFS服务器的搭建与配置(转载)
一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...
- 吐血分享:QQ群霸屏技术教程(利润篇)
QQ群技术,不论日进几百,空隙时间多的可以尝试,日进100问题不大. QQ群技术,如何赚钱,能赚多少钱?不同行业,不同关键词,不同力度,不一样的产出. 群费 群费,这个和付费群是有区别的,群费在手机端 ...
- 洛谷 T51922 父子
题目描述 对于全国各大大学的男生寝室,总是有各种混乱的父子关系. 那么假设现在我们一个男生寝室有不同的 nn 个人,每个人都至多有一个“爸爸”,可以有多个“儿子”,且有且只有一个人没有“爸爸”(毕竟是 ...
- for循环小练习
for循环是前测试循环语句 for(初始值:判定条件:步长){ 循环语句 } For循环原理: For循环第一次执行:首先执行语句1,然后执行语句2,如果条件为真,向内执行执行循环语句3. 如果条件为 ...
- mysql日志管理#慢日志详解
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中 long_q ...