序列式容器————vector
目录
介绍
1 创建
2 容量和大小
size()
capacity()
3 resize()
4 reverse()
5 获取元素
front()
back()
6 迭代器(待补充)
7 push_back()
8 emplace_back()
9 emplace()(待补充)
10 insert()
11 clear()
12 remove()
13 pop_back()
14 shrink_to_fit()
15 erase()
16 substr()
介绍
和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长。在大多数时候,都可以用 vector<T> 代替数组存放元素。只要能够意识到,vector<T> 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。
为了使用 vector<T> 容器模板,需要在代码中包含头文件 vector。
1 创建
vector<int> a ; //声明一个int型向量a
vector<int> a() ; //声明一个初始大小为10的向量
vector<int> a(, ) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
数组的初始化:
int n[] = {, , , , } ;
vector<int> a(n, n+) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[], &n[]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
2 容量和大小
vector 的容量大小,是指在不分配更多内存的情况下可以保存的最多元素个数,vector 的大小是它实际所包含的元素个数,也就是有值的元素的个数。
vector 的大小不能超出它的容董。当大小等于容量时,增加一个元素就会导致更多内存的分配。
(1)size()
返回大小,无符号整型值
(2)capacity()
返回容量,无符号整型值
3 resize()
改变容器大小。
std::vector<int> values {,,};
values.resize ();
//把元素的个数变为参数指定的值,所以会增加两个用默认值初始化的元素。
//如果添加了一个元素,导致超过当前容器的容景,容量会自动增加。 values.resize (, );
//将容器大小设为7,并用99来初始化新增的元素
//若7<原来的容器大小,那么就删除多余的元素
4 reverse()
改变容器容量(元素个数,整型)。
5 获取元素
使用下标索引[]
(1)front
返回第一个元素的引用
(2)back
返回最后一个元素的引用
因为成员函数 front() 和 back() 返回的是引用,所以它们可以出现在赋值运算符的左边。
values.front() = 2.71828;
6 迭代器
//全部输出
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)//t就是迭代器,表示元素位置,还可以前后移动
cout<<*t<<" " ;//*t为指针的间接访问形式,是访问t指向的元素值
7 push_back()
8 emplace_back()
emplace_back() 的参数正是添加到容器中的对象的构造函数所需要的参数。
emplace_back() 用它的参数作为构造函数的参数,在容器中生成对象。如果不想使用移动运算,使用 push_back()。
可以在 emplace_back() 函数中使用尽可能多的参数,只要它们满足对象构造函数的要求。这里有一个使用多参数的 emplace_back() 的示例:
std::string str {"alleged"};
words.emplace_back(str, , );
//生成一个string对象(alleged的索引2开始的三个元素组成):leg,然后将leg添加到words字符串后面
9 emplace()
通过使用成员函数 emplace(),可以在 vector 序列中插入新的元素。对象会在容器中直接生成,而不是先单独生成对象,然后再把它作为参数传入。
10 insert()
11 clear()
std::vector<int> data(, );// Contains 100 elements initialized to 99
data.clear(); // Remove all elements
移除了所有的元素,因此大小变为 0,因为这个操作并没有改变容器的容量,所以容量还是 100。
12 remove()
remove() 算法由定义在 algorithm 头文件中的模板生成。
vector<int>::iterator iter = std::remove(vec.begin(), vec.end(), val)
只是把val移到vec的末尾,并不真正删除,真正删除还是要调用一次erase函数。返回新的end()值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化
13 pop_back()
14 shrink_to_fit()
去掉容器中多余的容量,例如不再向容器中添加新元素。
data.shrink_to_fit();
15 erase()
iterator erase(iterator position); iterator erase(iterator first, iterator last);
删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。
一般remove和erase两者结合使用 删除vector中值为x的元素: vec.erase(remove(vec.begin(),vec.end(),x),vec.end());
16 substr()
s.substr(pos,n)
返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size()-pos,即不加参数会默认拷贝整个s);
补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾
序列式容器————vector的更多相关文章
- vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。
1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...
- STL源码剖析——序列式容器#1 Vector
在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...
- STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- 7.5 C++基本序列式容器
参考:http://www.weixueyuan.net/view/6402.html 总结: vector可以理解为可以在两端插入.删除数据的数组,它提供了丰富的成员函数,用于操作数据. begin ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- STL学习笔记(序列式容器)
Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector< ...
- 数据结构-STL序列式容器总结
根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...
随机推荐
- python GIL全局解释器锁与互斥锁 目录
python 并发编程 多线程 GIL全局解释器锁基本概念 python 并发编程 多线程 GIL与Lock python 并发编程 多线程 GIL与多线程
- vue中Runtime-Compiler和Runtime-only的区别
一.选择Runtime-Compiler和Runtime-only不同模式的时候main.js文件的区别 二.vue程序运行过程 1.解析: 第一步,当把vue模板template传给Vue实例 ...
- JNDI的初步理解
1.JDNI是什么意思? 答:JNDI是 java naming and directory interface 的缩写,是j2ee开发中的一种重要的规范 2.JNDI有什么用? 答:如果没有JNDI ...
- shell with hadoop
shell 命令操作 hadoop 之前多少提及过,这里做个总结. shell with hdfs 基本命令 bin/hadoop fs 大于下面的命令 bin/hdfs dfs dfs 是 fs 的 ...
- [.net core]1,asp.net core 的优势及特性
1.跨平台 支持windows ,linux .macOS 可以托管在iis,apache,Docker,或自宿在自己的进程 2.强大的IDE visual studio 或visual studio ...
- kafka复习(1)
一:flume复习 0.JMS(java message service )java消息服务 ----------------------------------------------------- ...
- java压缩文件中文名乱码问题
import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; 改为 import org.apache.tools.zip. ...
- TensorFlow基础与实战
开源工具 TensorFlow:谷歌,C++.Python,Linux.Windows.Mac OS X.Andriod.iOS Caffe:加州大学,C++.Python.Matlab,Linux. ...
- Python3使运行暂停的方法
在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同. 1.input(); 这种方法不用包含模块,因此这也是最常用的一种暂停手段. Python2中的raw_in ...
- CSS布局方式
1.内边距 padding <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...