C++标准库vector及迭代器
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件
#include<vector>
1.vector对象的定义和初始化
- vector<T> v1 vector保存类型为T的对象。默认构造函数,v1为空
- vector<T> v2(v1) v2是v1的一个副本
- vector<T> v3(n,i) v3包含n个值为i的元素
- vector<T> v4(n) v4含有值初始化的元素的n个副本
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。这个由库生成的初始值将用来初始化容器中的每个元素,具体的值为何,取决于存储在vector中元素的数据类型。
如果vector保存内置类型如int,那么标准库将用0值创建元素初始化式
vector<int> vv(10); //10个元素,每个被初始化为0
如果vector保存的是含有构造函数的类类型的元素,标准库将用该类型的默认的构造函数创建元素的初始化式
vector<string> vvvv(10) //10个元素,每个被初始化为空字符串
还有第三种情况,元素类型可能是没有定义构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
2.vector对象的操作
几种重要的操作
- v.empty() 如果v为空,则返回true,否则返回false
- v.size() 返回v中元素的个数
- v.push_back() 在v的末尾增加一个值为t的元素
- v[n] 返回v中位置为n的元素
- v1=v2 把v1中的元素替换为v2中元素的副本
- v1==v2 如果v1与v2相等,则返回true
- !=,<,<=,>,>= 保持这些操作符惯有含义
size()返回相应vector类定义的size_type的值。
vector::size_type //error
vector<int>::size_type //ok
push_back()函数将新元素添加到vector最后面。
3.迭代器简介
除了使用下标来访问vector对象的元素外,标准库还提供了访问元素的方法:使用迭代器。迭代器是一种检查容器内元素并且遍历元素的数据类型。
1.容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector:
vector<int> ::iterator iter;变量名为iter。
2.begin和end操作
每种容器都定义了一队命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的元素指向第一个元素。
vector<int>::iterator iter=v.begin();
若v不为空,iter指向v[0]。
由end返回的迭代器指向最后一个元素的下一个,不存在,若v为空,begin和end返回的相同。
*iter=0;
iter++即将迭代器向前移动一个位置
即将v[0]赋值为0,由end返回的不允许进行解操作。
==和!=操作符来比较两个迭代器,若两个迭代器指向同一个元素,则它们相等,否则不想等。
迭代器使用举例:
for(vector<int>::iterator iter=v.begin();iter!=v.end();iter++)
*iter=0;
将vector中的元素全部赋值为0;
=================================================================
vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。
vector类常用的函数如下所示:
1.构造函数
- vector():创建一个空vector
- vector(int nSize):创建一个vector,元素个数为nSize
- vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&):复制构造函数
- vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2.增加函数
- void push_back(const T& x):向量尾部增加一个元素X
- iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
- iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3.删除函数
- iterator erase(iterator it):删除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
- void pop_back():删除向量中最后一个元素
- void clear():清空向量中所有元素
4.遍历函数
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量头指针,指向第一个元素
- iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin():反向迭代器,指向最后一个元素
- reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
- bool empty() const:判断向量是否为空,若为空,则向量中无元素
6.大小函数
- int size() const:返回向量中元素的个数
- int capacity() const:返回当前向量张红所能容纳的最大元素值
- int max_size() const:返回最大可允许的vector元素数量值
7.其他函数
- void swap(vector&):交换两个同类型向量的数据
- void assign(int n,const T& x):设置向量中第n个元素的值为x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
示例:
1.初始化示例
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- class A
- {
- //空类
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector
- vector<int> vecInt;
- //float型vector
- vector<float> vecFloat;
- //自定义类型,保存类A的vector
- vector<A> vecA;
- //自定义类型,保存指向类A的指针的vector
- vector<A*> vecPointA;
- return 0;
- }
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- class A
- {
- //空类
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<int> vecIntA(3);
- //int型vector,包含3个元素且每个元素都是9
- vector<int> vecIntB(3,9);
- //复制vecIntB到vecIntC
- vector<int> vecIntC(vecIntB);
- int iArray[]={2,4,6};
- //创建vecIntD
- vector<int> vecIntD(iArray,iArray+3);
- //打印vectorA,此处也可以用下面注释内的代码来输出vector中的数据
- /*for(int i=0;i<vecIntA.size();i++)
- {
- cout<<vecIntA[i]<<" ";
- }*/
- cout<<"vecIntA:"<<endl;
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- //打印vecIntB
- cout<<"VecIntB:"<<endl;
- for(vector<int>::iterator it = vecIntB.begin() ;it!=vecIntB.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- //打印vecIntC
- cout<<"VecIntB:"<<endl;
- for(vector<int>::iterator it = vecIntC.begin() ;it!=vecIntC.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- //打印vecIntD
- cout<<"vecIntD:"<<endl;
- for(vector<int>::iterator it = vecIntD.begin() ;it!=vecIntD.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- return 0;
- }
程序的运行结果如下:
上面的代码用了4种方法建立vector并对其初始化
2.增加及获得元素示例:
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<int> vecIntA;
- //插入1 2 3
- vecIntA.push_back(1);
- vecIntA.push_back(2);
- vecIntA.push_back(3);
- int nSize = vecIntA.size();
- cout<<"vecIntA:"<<endl;
- //打印vectorA,方法一:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecIntA[i]<<" ";
- }
- cout<<endl;
- //打印vectorA,方法二:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecIntA.at(i)<<" ";
- }
- cout<<endl;
- //打印vectorA,方法三:
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- return 0;
- }
上述代码对一个整形向量类进行操作,先定义一个整形元素向量类,然后插入3个值,并用3种不同的方法输出,程序运行结果如下:
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- class A
- {
- public:
- int n;
- public:
- A(int n)
- {
- this->n = n;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<A> vecClassA;
- A a1(1);
- A a2(2);
- A a3(3);
- //插入1 2 3
- vecClassA.push_back(a1);
- vecClassA.push_back(a2);
- vecClassA.push_back(a3);
- int nSize = vecClassA.size();
- cout<<"vecClassA:"<<endl;
- //打印vecClassA,方法一:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecClassA[i].n<<" ";
- }
- cout<<endl;
- //打印vecClassA,方法二:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecClassA.at(i).n<<" ";
- }
- cout<<endl;
- //打印vecClassA,方法三:
- for(vector<A>::iterator it = vecClassA.begin();it!=vecClassA.end();it++)
- {
- cout<<(*it).n<<" ";
- }
- cout<<endl;
- return 0;
- }
上述代码通过定义元素为类的向量,通过插入3个初始化的类,并通过3种方法输出,运行结果如下:
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- class A
- {
- public:
- int n;
- public:
- A(int n)
- {
- this->n = n;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<A*> vecClassA;
- A *a1 = new A(1);
- A *a2 = new A(2);
- A *a3 = new A(3);
- //插入1 2 3
- vecClassA.push_back(a1);
- vecClassA.push_back(a2);
- vecClassA.push_back(a3);
- int nSize = vecClassA.size();
- cout<<"vecClassA:"<<endl;
- //打印vecClassA,方法一:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecClassA[i]->n<<"\t";
- }
- cout<<endl;
- //打印vecClassA,方法二:
- for(int i=0;i<nSize;i++)
- {
- cout<<vecClassA.at(i)->n<<"\t";
- }
- cout<<endl;
- //打印vecClassA,方法三:
- for(vector<A*>::iterator it = vecClassA.begin();it!=vecClassA.end();it++)
- {
- cout<<(**it).n<<"\t";
- }
- cout<<endl;
- delete a1; delete a2;delete a3;
- return 0;
- }
上述代码通过定义元素为类指针的向量,通过插入3个初始化的类指针,并通过3种方法输出指针指向的类,运行结果如下:
3.修改元素示例
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<int> vecIntA;
- //插入1 2 3
- vecIntA.push_back(1);
- vecIntA.push_back(2);
- vecIntA.push_back(3);
- int nSize = vecIntA.size();
- //通过引用修改vector
- cout<<"通过数组修改,第二个元素为8:"<<endl;
- vecIntA[1]=8;
- cout<<"vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- //通过引用修改vector
- cout<<"通过引用修改,第二个元素为18:"<<endl;
- int &m = vecIntA.at(1);
- m=18;
- cout<<"vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- //通过迭代器修改vector
- cout<<"通过迭代器修改,第二个元素为28"<<endl;
- vector<int>::iterator itr = vecIntA.begin()+1;
- *itr = 28;
- cout<<"vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<" ";
- }
- cout<<endl;
- return 0;
- }
程序运行结果如下:
4.删除向量示例
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //int型vector,包含3个元素
- vector<int> vecIntA;
- //循环插入1 到10
- for(int i=1;i<=10;i++)
- {
- vecIntA.push_back(i);
- }
- vecIntA.erase(vecIntA.begin()+4);
- cout<<"删除第5个元素后的向量vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<"\t";
- }
- cout<<endl;
- //删除第2-5个元素
- vecIntA.erase(vecIntA.begin()+1,vecIntA.begin()+5);
- cout<<"删除第2-5个元素后的vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<"\t";
- }
- cout<<endl;
- //删除最后一个元素
- vecIntA.pop_back();
- cout<<"删除最后一个元素后的vecIntA:"<<endl;
- //打印vectorA
- for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
- {
- cout<<*it<<"\t";
- }
- cout<<endl;
- return 0;
- }
程序运行结果如下:
3.进一步理解vector,如下图所示:
4.综合示例
- // vectorsample.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<iostream>
- #include<vector>
- #include<string>
- using namespace std;
- class Student
- {
- public:
- string m_strNO;
- string m_strName;
- string m_strSex;
- string m_strDate;
- public:
- Student(string strNO,string strName,string strSex,string strDate)
- {
- m_strNO = strNO;
- m_strName = strName;
- m_strSex = strSex;
- m_strDate = strDate;
- }
- void Display()
- {
- cout<<m_strNO<<"\t";
- cout<<m_strName<<"\t";
- cout<<m_strSex<<"\t";
- cout<<m_strDate<<"\t";
- }
- };
- class StudCollect
- {
- vector<Student> m_vStud;
- public:
- void Add(Student &s)
- {
- m_vStud.push_back(s);
- }
- Student* Find(string strNO)
- {
- bool bFind = false;
- int i;
- for(i = 0;i < m_vStud.size();i++)
- {
- Student& s = m_vStud.at(i);
- if(s.m_strNO == strNO)
- {
- bFind = true;
- break;
- }
- }
- Student *s = NULL;
- if(bFind)
- s = &m_vStud.at(i);
- return s;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- Student s1("1001","zhangsan","boy","1988-10-10");
- Student s2("1002","lisi","boy","1988-8-25");
- Student s3("1003","wangwu","boy","1989-2-14");
- StudCollect s;
- s.Add(s1);
- s.Add(s2);
- s.Add(s3);
- Student *ps = s.Find("1002");
- if(ps)
- ps->Display();
- return 0;
- }
代码运行实例如下:
C++标准库vector及迭代器的更多相关文章
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- C++ Primer 有感(标准库vector及迭代器)
vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...
- C++标准库vector以及迭代器
今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存. ...
- c/c++ 标准库 vector
c/c++ 标准库 vector 标准库 vector的小例子 test1~test7 #include <iostream> #include <vector> using ...
- 【转】C++ 标准库值操作迭代器的常见函数
迭代器是C++标准库中的重要组件,特别是在容器内部,没有迭代器,容器也就无所谓存在了. 例如:vector容器简而言之就是3个迭代器 start finish 以及end_of_storage vec ...
- C++标准库vector类型的使用和操作总结
vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...
- C++标准库vector类型详解
Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...
- C++之标准库vector
目录 1.成员函数 2.元素访问 3.迭代器iterator 4.容量capacity 5.修改函数 std::vector是一个封装动态数组的序列容器 std::pmr::vector是一个使用多态 ...
- c++标准库vector&list使用练习
/* vector顺序存储,随机访问快 list链表存储,插入删除快 deque占用内存多,兼具两者优点 注意: 1.vector严格顺序存储 2.list的迭代器只能做++或--运算,要一次移动多个 ...
随机推荐
- strcmp()比较函数和strcasecmp()和strnatcmp()
strcmp()的函数原型如下() int strcmp(string str1,string str2) 该函数需要两个进行比较的参数字符串,如果这两个字符串相等,该函数就返回0,如果按字典顺序st ...
- PHP的count(数组)和strlen(字符串)的内部实现
PHP的count(数组)和strlen(字符串)的内部实现上是直接显示一个长度变量,还是重头依次数一遍有多少个元素?关乎我理解这2个函数的效率..希望高人能从php的c源码上讲一讲.没有源码看过源码 ...
- linux中怎么结果一页一页输出
比如sudo apt-cache search php 结果可能有两个屏幕,但是命令执行完毕之后直接就跳到最后面了,我想看第一行怎么办? 可以用管道命令(|)把一个命令的结果作为另一个命令的参数即可. ...
- R: 主成分分析 ~ PCA(Principal Component Analysis)
本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感谢. 综述: 主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据 ...
- loj2436 糖果
传送门 分析 我们知道对于一个不等式a<b可以将其转化为a+1<=b的形式,在知道这个之后我们便可以将5个关系进行差分约束了,具体的建边方式见代码.注意由于每个人都必须有糖,我们把每个人的 ...
- 3.文档视图:从gui分割状态
为了解决一个类实现所有功能的缺陷,我们把application分为2个部分.一个部分业务逻辑,一个部分视觉渲染和交互.这2个类在学术上被称为document view 或者 model delegat ...
- 数据结构_Summary
问题描述 可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记下了他认为的各个地点的小偷数量.现在我们将 Bibi 的家附近的地形抽象成一棵有根树. 每个地点都是树上的一个节点,节 ...
- Bootstrap 组件之 Nav
一.简介 Nav 指导航页.这里 是一个线上例子. 使用了 .nav 的标签就是一个 Nav.下面举例. {注意} 记住,下面的几种导航页都依赖 .nav. 二.导航页 添加 .nav-tabs. & ...
- 基于DEV控件库的webservice打印.repx模板
本文使用的DEV版本为10.1版本 首先需要添加Dll引用 DevExpress.Data.v10.1 DevExpress.XtraPrinting.v10.1 DevExpress.XtraRep ...
- Codeforces Global Round 1D(DP,思维)
#include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){ ...