STL vector用法介绍
更新时间:2023-08-05 18:44:01 阅读量: 实用文档 文档下载
- stl推荐度:
- 相关推荐
介绍
这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。
Vector总览
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector?
vector<int> vInts?
或者连在一起,使用全名:
std::vector<int> vInts?
建议使用全局的命名域方式:
using namespace std?
在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。
Vector成员函数
函数表述
c.assign(beg,end) c.assign(n,elem)将[beg? end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
c.at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back()传回最后一个数据,不检查这个数据是否存在。
c.begin()传回迭代器重的可一个数据。
c.capacity()返回容器中数据个数。
c.clear()移除容器中所有数据。
c.empty()判断容器是否为空。
c.end()指向迭代器中的最后一个数据地址。
c.erase(pos) c.erase(beg,end)删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。
c.front()传回第一个数据。
get_allocator使用构造函数返回一个拷贝。
c.insert(pos,elem) c.insert(pos,n,elem)在pos位置插入一个elem拷贝,传回新数据位置。在pos位置插入n个elem数据。无返回值。
c.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size()返回容器中最大数据的数量。
c.pop_back()删除最后一个数据。
c.push_back(elem)在尾部加入一个数据。
c.rbegin()传回一个逆向队列的第一个数据。
c.rend()传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num)重新指定队列的长度。
c.reserve()保留适当的容量。
c.size()返回容器中实际数据的个数。
c1.swap(c2) swap(c1,c2)将c1和c2元素互换。同上操作。
vector<Elem> c
vector <Elem> c1(c2) vector <Elem> c(n) vector <Elem> c(n, elem) vector <Elem> c(beg,end) c.~ vector <Elem>()创建一个空的vector。
复制一个vector。
创建一个vector,含有n个数据,数据均已缺省构造产生。创建一个含有n个elem拷贝的vector。
创建一个以[beg?end)区间的vector。
销毁所有数据,释放内存。
Vector操作
函数描述
operator[]返回容器中指定位置的一个引用。
创建一个vector
vector容器提供了多种创建方法,下面介绍几种常用的。
创建一个Widget类型的空的vector对象:
vector<Widget> vWidgets?
//
// |
// | Since vector is a container, its member functions
// operate on iterators and the container itself so
// it can hold objects of any type.
创建一个包含500个Widget类型数据的vector:
vector<Widget> vWidgets(500)?
创建一个包含500个Widget类型数据的vector,并且都初始化为0:
vector<Widget> vWidgets(500, Widget(0))?
创建一个Widget的拷贝:
vector<Widget> vWidgetsFromAnother(vWidgets)?
向vector添加一个数据
vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector<Widget>中添加10个数据,需要如下编写代码:
for(int i= 0?i<10? i++)
vWidgets.push_back(Widget(i))?
获取vector中制定位置的数据
很多时候我们不必要知道vector里面有多少数据,vector里面的数据是动态分配的,使用push_back()的一系列分配空间常
常决定于文件或一些数据源。如果你想知道vector存放了多少数据,你可以使用empty()。获取vector的大小,可以使用size()。例如,如果你想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为1,你可以使用下
面的代码实现:
int nSize = v.empty() ? 1 : static_cast<int>(v.size())?
访问vector中的数据
使用两种方法来访问vector。
1、 vector::at()
2、 vector::operator[]
operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector<int> v?
v.reserve(10)?
for(int i=0? i<7? i++)
v.push_back(i)?
try
{
int iVal1 = v[7]? // not bounds checked will not throw
int iVal2 = v.at(7)? // bounds checked will throw if out of range
}
catch(const exception& e)
{
cout << e.what()?
}
我们使用reserve()分配了10个int型的空间,但并不没有初始化。
你可以在这个代码中尝试不同条件,观察它的结果,但是无论何时使用at(),都是正确的。
删除vector中的数据
vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。在考虑删除等操作之前让我们静下来考虑一下在STL中的一些应用。
Remove_if()算法
现在我们考虑操作里面的数据。如果要使用remove_if(),我们需要在头文件中包含如下代码::
#include <algorithm>
Remove_if()有三个参数:
1、 iterator _First:指向第一个数据的迭代指针。
2、 iterator _Last:指向最后一个数据的迭代指针。
3、 predicate _Pred:一个可以对迭代操作的条件函数。
条件函数
条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或者是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove_if()是通过unary_function继承下来的,允许传递数据作为条件。
例如,假如你想从一个vector<CString>中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。
首先你应该建立一个数据结构来包含这些数据,类似代码如下:
#include <functional>
enum findmodes
{
FM_INVALID = 0,
FM_IS,
FM_STARTSWITH,
FM_ENDSWITH,
FM_CONTAINS
}?
typedef struct tagFindStr
{
UINT iMode?
CString szMatchStr?
} FindStr?
typedef FindStr* LPFINDSTR?
然后处理条件判断:
class FindMatchingString
: public std::unary_function<CString, bool>
{
public:
FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {}
bool operator()(CString& szStringToCompare) const
{
bool retVal = false?
switch(m_lpFS>iMode)
{
case FM_IS:
{
retVal = (szStringToCompare == m_lpFDD>szMatchStr)?
break?
}
case FM_STARTSWITH:
{
retVal = (szStringToCompare.Left(m_lpFDD>szMatchStr.GetLength())
== m_lpFDD>szWindowTitle)?
break?
}
case FM_ENDSWITH:
{
retVal = (szStringToCompare.Right(m_lpFDD>szMatchStr.GetLength())
== m_lpFDD>szMatchStr)?
break?
}
case FM_CONTAINS:
{
retVal = (szStringToCompare.Find(m_lpFDD>szMatchStr) != 1)?
break?
}
}
return retVal?
}
你可以看到我们做了什么?我们创建了一个临时变量代替那个命名的,然后使用swap(),这样我们就去掉了不必要的空间,得到实际大小的v。
结论
我希望这个文档可以给那些使用STL vector容器的开发者很有价值的参考。我也希望通过阅读这篇文章你可以放心地使用vector来代替C语言中的数据了。
正在阅读:
STL vector用法介绍08-05
2019-2020年高三下学期第1次测试理综试题 含答案05-16
初三数学周周清(9)02-29
高中语文文学常识大全,艺考生高考必备资料,高分必备03-08
C51单片机试卷104-02
人教版五年级下册分数的意义与性质知识点及练习题 - 图文01-13
VASP计算有限温度下的晶格常数12-16
2017(人教版)五年级数学下册 期末模拟试题(有答案)04-15
财务管理实训心得体会12-31
- 1Multiple Description Vector Quantization with Lattice Codebooks Design and Analysis
- 2Vector CANoe8.2基础操作教程
- 3科学绘图及数据软件Origin9.0的用法介绍
- 4CAN设计流程中使用的VECTOR工具
- 5CAN设计流程中使用的VECTOR工具
- 6Multiple Description Vector Quantization with Lattice Codebooks Design and Analysis
- 7Forecasting Financial Time Series with Support Vector Machines.
- 8Android教程之AndroidManifest.xml文件详细介绍及用法解析
- 9c++STL容器适配器习题答案
- 10that 用法
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 用法
- vector
- 介绍
- STL
- 新译林版3A英语单词学习
- 中国产业结构变迁对经济增长和波动的影响
- 年终奖发放表模板
- 颜色十六进制的表示
- 计算机专业英语
- 中国社会经济热点问题分析与讨论
- 小学生作文:我不再自卑
- 钢笔字速成口诀
- 复合微生物菌肥应用于马尾松造林试验研究
- Sapera-DevelopHelp-senior
- 小学英语pep五年级下册Unit+5+look+at+monkeys+第一课时说课稿
- 成都市生育、 计划生育手术医疗费审批表
- 4吨蒸汽锅炉操作规程
- 中考语文复习测试题(第01期)专题03 正确使用标点符号(含解析)
- 学校半年度综治工作小结模板(通用版)
- 安全学习心得--经典语句
- 虚拟机后缀文件
- 对天津城市风貌特色的分析及其传承的思考
- 【优质】班主任经典评语集锦-精选word文档 (1页)
- 精准扶贫工作方案