从零开始学C++之标准库类型(二):vector 类简介和例程
来源:互联网 发布:竹子家具的优缺点 知乎 编辑:程序博客网 时间:2024/06/05 20:30
一、标准库的vector类型
vector是同一种类型的对象的集合
vector的数据结构很像数组,能非常高效和方便地访问单个元素
vector是一个类模板(class template)
vector不能存放引用。
template < class Type, class Allocator = allocator<Type> >class vector
要使用vector必须包含相关头文件
#include <vector>using std::vector;
vector对象的初始化:
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<T> v5(v1.begin(), v1.end()); // iterating through v1
vector常用成员函数:
resize 和 reserve的区别:
void reserve(size_type n);
(1)如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块更大的连续空间,其大小为sizeof(T)*n,然后将容器内所有有效元素全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器的成员指针。注意:容器的大小(即size())并没有发生改变。
(2)否则,什么也不做。
void resize(size_type n, const T& c = T());
(1)如果n大于容器当前的大小(即size()),则在容器的末尾插入n-size()个初值为c的元素,如果不指定初值,则用元素类型的默认构造函数来初始化(这可能引起内存重分配以及容器容量的扩张)。
(2)如果n小于容器当前的大小,则从容器的末尾删除size()-n 个元素,但不释放元素本身的内存空间,因此容量不变。
(3)否则,什么也不做。
e.g
vector<char> vec;printf(”%zd %zd\n”, vec.size(), vec.capacity());vec.resize(1024);printf(”%zd %zd\n”, vec.size(), vec.capacity());vec.resize(1300);printf(”%zd %zd\n”, vec.size(), vec.capacity());
运行结果:
0 0 # 一开始size() 和capacity() 都是0
1024 1024 # resize(1024) 之后size() 和capacity() 都是1024
1300 2048 # resize(稍大) 之后capacity() 翻倍,相当于reserve(2048)
例程1:
#include <vector>#include <iostream>using namespace std;typedef vector<int> INTVEC;//void ShowVec(const INTVEC& v)//{// unsigned int i;// for (i=0; i<v.size(); i++)// {// cout<<v[i]<<" ";// }// cout<<endl;//}//void ShowVec(INTVEC& v)//{// INTVEC::iterator it;// for (it=v.begin(); it!=v.end(); ++it)// {// cout<<*it<<" ";// }//// cout<<endl;//}void ShowVec(const INTVEC &v){ INTVEC::const_iterator it; for (it = v.begin(); it != v.end(); ++it) //所有迭代器都重载了!=运算符,但有些没有重载<运算符。 { cout << *it << " "; } cout << endl;}int main(void){ INTVEC v; v.push_back(1); v.push_back(2); v.push_back(3); ShowVec(v); return 0;}
例程2:
#include <vector>#include <iostream>#include <algorithm>using namespace std;typedef vector<int> INTVEC;void ShowVec(const INTVEC &v){ INTVEC::const_iterator it; for (it = v.begin(); it != v.end(); ++it) { cout << *it << " "; } cout << endl;}int main(void){ INTVEC v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(3); //cout<<v.back()<<endl; //v.pop_back(); ShowVec(v); //v.erase(v.begin()+2); //v.erase(v.begin(), v.begin()+2); v.erase(remove(v.begin(), v.end(), 3), v.end()); ShowVec(v); return 0;}
例程3:
#include <vector>#include <iostream>#include <algorithm>using namespace std;typedef vector<int> INTVEC;void ShowVec(const INTVEC &v){ INTVEC::const_iterator it; for (it = v.begin(); it != v.end(); ++it) { cout << *it << " "; } cout << endl;}int main(void){ INTVEC v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(3); ShowVec(v); //v.erase(remove(v.begin(), v.end(), 3), v.end()); INTVEC::iterator it; for (it = v.begin(); it != v.end(); /*++it*/) { if (*it == 3) { it = v.erase(it); // erase返回的是当前删除元素的下一个元素 } else ++it; } ShowVec(v); return 0;}
参考:
C++ primer 第四版
Effective C++ 3rd
C++编程规范
转载自http://blog.csdn.net/jnu_simba/article/details/9301943
- 从零开始学C++之标准库类型(二):vector 类简介和例程
- 从零开始学C++之标准库类型(二):vector 类简介和例程
- 从零开始学C++之标准库类型(二):vector 类简介和例程
- 从零开始学C++之标准库类型(一):string 类简介和例程
- 从零开始学C++之标准库类型(三):map 类简介和例程
- 从零开始学C++之标准库类型(一):string 类简介和例程
- 从零开始学C++之标准库类型(三):map 类简介和例程
- 从零开始学C++之标准库类型(一):string 类简介和例程
- 从零开始学C++之标准库类型(三):map 类简介和例程
- 标准库vector类型简介
- 小朋友学C++(18):标准库vector类
- C++,标准库类型vector
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- C++ Primer学习笔记7 标准库类型(标准库vector类型、迭代器简介)
- C++之 标准库类型 Vector和String
- 二十二、标准库类型vector的使用、vector介绍、vector构造和初始化、vector常用成员函数
- C++primer(第五版)第三章中标准库类型Vector、迭代器和数组
- PHP魔术方法之__toStrring()
- Android客户端与服务器交互中的token
- 新建数据库后CONNECT连接不了
- 《保卫萝卜》项目实践(2)
- C++11新特性
- 从零开始学C++之标准库类型(二):vector 类简介和例程
- Method详解
- 从mysqldump文件中提取某一天某一表格的sql语句
- Ajax的前端应用
- Deep Learning及NLP(自然语言处理)杂谈--第一部分
- 宏定义
- JAVA异常处理二--finally
- Python中Django后端应用
- 创建外网 ext_net - 每天5分钟玩转 OpenStack(104)