STL 之 vector 的使用 (转载)
第一部分 使用入门
vector可用于代替C中的数组,或者MFC中的CArray,从许多说明文档或者网上评论,一般一致认为应该多用vector,因为它的效率更高,而且具备很好的异常安全性。而且vector是STL推荐使用的默认容器,除非你知道你有特殊需要,使用vector不能满足你的需求,例如需要容器在 head和tail高效的插入和删除,或者在任何位置高效的删除和插入操作,那么你可能使用deque或者list更加合适。
如果我们想用原始数组的内容填充vector,那么于有很多种方式。我们来一次学习vector的几个方法。
初始化方式1: vector<int> v2(10); //初始化size为10可以避免数组动态增长的时候不断的分配内存 //v2.reserve(10);//同上,只要使用其中一个就可以了 for( int i=0; i<10; i++ ) {v2.push_back(v1[i]);//增加一个元素 }
初始化方式2: vector<int> v3(&v1[0],&v1[9]);//原始数组的元素指针可以作为迭代器来使用
初始化方式3: vector<int> v4; v4.reserve(10); v4.insert(v4.begin(), &v1[0], &v[9]);
初始化方式4: vector<int> v5(10); copy(v5.begin(), &v1[0], &v1[9]); //原始数组的元素指针可以作为迭代器来使用。
vector<int>::iterator i = find( v1.begin(), v1.end(), 3); if( i != v1.end() ) {v1.insert( i, 6 ); }
例如有vector<int> v1;
方式2:
typedef vector<int>:: iterator VIntIterator; VIntIterator end = v1.begin(); for( VIntIterator i=v1.begin(); i != end; ++i ) {print( *i ); }
注意:先计算end有好处,因为不必要每次去重复计算end,vector的end()不是常数时间的,所以先缓存下来能提高效率。写算法的时候尽量使用!=比较迭代器,因为<对于很多非随机迭代器没有这个操作符。
for_each( v1.begin(), v1.end(), print );
使用算法写起来简单多了。
使用算法的时候,可以使用函数对象,例如
class OutPut { public:void operator ()( double i ){std::cout << i; } } for_each( v1.begin(), v1.end(), OutPut );
删除指定元素
vector<double> v1; //….初始化代码 vector<double>:: iterator i = find( v1.begin(), v1.end(), 3.0 ); if( i != v1.end() ) {v1.erase(i); }
这样就真的删除了么指定的元素了么?没有。其实只是内部的元素作了移动,vector的删除的时间复杂度是很高的。所以选择容器的时候,如果需要频繁在中间插入和删除元素,那选择vector就会影响效率了。
原则:使用erase-remove惯用法删除元素
4,vector是否为空
在判断容器是否为空的时候,使用empty()来代替size()是否为了0的检查方式,因为empty更加高效时间复杂度是常数时间的,size()时间复杂度不是常数时间的。
5,vector中的查找
原则:尽量使用标准容器自带的算法代替公共算法。
6,使用交换技巧来修正过剩的容量
vector<int> v1;
vector<int> v2;
6,题外话:使用算法及其他技巧
原则:不要使用auto_ptr作为模板参数来建立容器,这会产生意想不到的陷阱,因为auto_ptr的拷贝有特殊的语义
原则:尽量使用区间成员函数代替它们的单元素参数兄弟成员函数
原则:使得容器中元素的拷贝操作轻量而正确,拷贝是STL中容器的运行的基本方式,将元素加入到容器,必然保持一个拷贝,容器中的元素不再是原来的那个元素,所以如果将指针加入容器,必须在容器离开作用域以前删除指针所指的对象。
原则:注意对于 vector,任何插入删除操作都会引起迭代器失效。所以要小心。
第二部分 使用错误讨论
vector的语义常被误解,所以经常会出现使用错误
你能发现下面的问题所在么?
#1和#2有何区别?
void func1( vector<int>& v1 )
2,案例二
使用vector的时候最容易发生的运行时错误,莫过于迭代器错误
转载于:https://www.cnblogs.com/cosmo89929/archive/2013/02/26/2932932.html
STL 之 vector 的使用 (转载)相关推荐
- STL 之vector详解
STL之vector容器详解 vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样 ...
- C++ STL之vector常用方法
C++ STL之vector常用方法 头文件 #include<vector> 初始化方法 vector<int> v; //初始化一个int类型.size为0的vectorv ...
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- C++STL的vector容器
C++STL的vector容器 vector容器 vector基本概念 vector构造函数 vector赋值操作 vector容量和大小 vector插入和删除 vector数据存取 vector互 ...
- vector 清空 Linux,STL容器vector基础用法小结
STL容器vector基础用法小结根据<ACM程序设计>写的,用实例展示vector用法. 方法:push_back(), insert(), erase(), clear(), size ...
- oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- STL中Vector的内存分配机制
一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析.今天看了下相关文章,也写了几个小的测试程序跑了跑.算是总结下,希望对需要的 ...
- C++ [STL之vector模拟实现]
本文已收录至<C++语言和高级数据结构>专栏! 作者:ARMCSKGT STL之vector模拟实现 前言 正文 空间结构 默认成员函数 构造函数 拷贝构造函数 赋值重载 析构函数 关于数 ...
- STL中vector、list、deque和map的区别
vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy( ...
- [转载] C++ STL之 vector的capacity和size属性区别
参考链接: C++ Vector中capacity与size vector中这两个属性很容易弄混淆. size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器. capacity是指 ...
最新文章
- 特征点检测学习_2(surf算法)
- js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...
- python开发个人博客_手把手教你用 Python + Flask 搭建个人博客
- SAP UI5 Routing 路由介绍
- Java项目课程06:系统实现-数据库
- linux查看宽带ip是否动态,linux CentOS系统查看实时宽带的办法
- 手写邮箱获取验证码注册登录功能
- SAP License:买十送一的业务处理与系统实现
- 英语总结系列(十五):别样的三月
- 转: 中/英文资料 PKCS #11 函数列表
- [收藏]Visual Component Framework
- vue 微信公众号 前端开发
- angularjs textarea 剩余字数统计
- 为革命保护视力 --- 给 Visual Studio 换颜色
- HTTP协议详解你确定不看吗
- OCR-文本检测后的文字纠正
- 聊聊程序员的 3 个烦恼
- 每个 Apache Kafka 开发者都应该知道的5件事
- docx行间距怎么设置_Word如何调整字间距,行间距.docx
- 计算机四级网络-网络技术-第五章 新型网络应用
热门文章
- java protected_Java中的访问修饰符详解
- docker 容器安装conposer_docker和composer安装
- python多线程学了多久_Python多线程一学就会!
- jackson json转bean忽略没有的字段 not marked as ignorable
- xshell的一些常用配置
- 递归的效率问题以及递归与循环的比较
- C# 获取打开的EXCEL中某列的行数
- 2017 Multi-University Training Contest - Team 4 hdu6071 Lazy Running
- TypeScript之基本数据类型
- PC/UVA 110405/10026 Shoemaker's problem