C++ Vector(向量容器)

Vector介绍

C++ Vector(向量容器)

是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。

在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:

首先,vector 会申请一块更大的内存块;

然后,将原来的数据拷贝到新的内存块中;

其次,销毁掉原内存块中的对象(调用对象的析构函数);

最后,将原来的内存空间释放掉。

如果vector 保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector 被设计成比较容易拷贝的值类型的原因)。所以说vector 不是在什么情况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。

 

vector 的特点:

(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 

(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at()

(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。

(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作,其原因是vector内部的实现是按照顺序表的原理。

(5) 只能在vector 的最后进行push pop ,不能在vector 的头进行push pop 

(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。

Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

 

1.Constructors 构造函数

vector<int> v1; //构造一个空的vector

vector<int> v1( 5, 42 ); //构造了一个包含5个值为42的元素的Vector

2.Operators 对vector进行赋值或比较

C++ Vectors能够使用标准运算符: ==, !=, <=, >=, <, 和 >.

要访问vector中的某特定位置的元素可以使用 [] 操作符.

两个vectors被认为是相等的,如果:

1.它们具有相同的容量

2.所有相同位置的元素相等.

vectors之间大小的比较是按照词典规则.

3.assign() 对Vector中的元素赋值

语法:

void assign( input_iterator start, input_iterator end );

// 将区间[start, end)的元素赋到当前vector

void assign( size_type num, const TYPE &val );

// 赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容。

4.at() 返回指定位置的元素

语法:

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

5.back() 返回最末一个元素

6.begin() 返回第一个元素的迭代器

7.capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)

8.clear() 清空所有元素

9.empty() 判断Vector是否为空(返回true时为空)

10.end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)

11.erase() 删除指定元素

语法:

iterator erase( iterator loc );//删除loc处的元素

iterator erase( iterator start, iterator end );//删除start和end之间的元素

12.front() 返回第一个元素的引用

13.get_allocator() 返回vector的内存分配器

14.insert() 插入元素到Vector中

语法:

iterator insert( iterator loc, const TYPE &val );

//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,

void insert( iterator loc, size_type num, const TYPE &val );

//在指定位置loc前插入num个值为val的元素

void insert( iterator loc, input_iterator start, input_iterator end );

//在指定位置loc前插入区间[start, end)的所有元素

15.max_size() 返回Vector所能容纳元素的最大数量(上限)

16.pop_back() 移除最后一个元素

17.push_back() 在Vector最后添加一个元素

18.rbegin() 返回Vector尾部的逆迭代器

19.rend() 返回Vector起始的逆迭代器

20.reserve() 设置Vector最小的元素容纳数量

//为当前vector预留至少共容纳size个元素的空间

21.resize() 改变Vector元素数量的大小

语法:

void resize( size_type size, TYPE val );

//改变当前vector的大小为size,且对新创建的元素赋值val

22.size() 返回Vector元素数量的大小

23.swap() 交换两个Vector

语法:

void swap( vector &from );

 

 Vector用法 :

1.声明:

一个vector类似于一个动态的一维数组。

vector<int> a; //声明一个元素为int类型的vector a

vectot<MyType> a; //声明一个元素为MyType类型的vector a

这里的声明的a包含0个元素,既a.size()的值为0,但它是动态的,其大小会随着数据的插入和删除改变而改变。

vector<int> a(100, 0); //这里声明的是一个已经存放了100个0的整数vector

你可以用以下的几种方法声明一个 vector 对象:

vector<float> v(5, 3.25); //初始化有5 个元素,其值都是3.25

vector<float> v_new1(v);

vector<float> v_new2 = v;

vector<float> v_new3(v.begin(), v.end());

这四个vector 对象是相等的,可以用operator==来判断。

2.向量操作

常用函数:

size_t size(); // 返回vector的大小,即包含的元素个数

void pop_back(); // 删除vector末尾的元素,vector大小相应减一

void push_back(); //用于在vector的末尾添加元素

T back(); // 返回vector末尾的元素

void clear(); // 将vector清空,vector大小变为0

其他访问方式:

cout<<a[5]<<endl;

cout<<a.at(5)<<endl;

以上区别在于后者在访问越界时会抛出异常,而前者不会。

3.遍历

(1). for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)

cout<<*it<<endl;

(2). for(int i=0;i<a.size;i++)

cout<<a[i]<<endl;

 

现在想得到容器中能保存的最大元素数量就可以用 vector 类的成员函数max_size():

vector<shape>::size_type max_size = my_shapes.max_size();

当前容器的实际尺寸 --- 已有的元素个数用size():

vector<shape>::size_type size = my_shapes.size();

就像size_type 描述了vector 尺寸的类型,value_type 说明了其中保存的对象的类型:

cout << “value type: “ << typeid(vector<float>::value_type).name();

输出:

value type: float

可以用capacity()来取得vector 中已分配内存的元素个数:

vector<int> v;

vector<int>::size_type capacity = v.capacity();

vector 类似于数组,可以使用下标[]访问:

vector<int> v(10);

v[0] = 101;

注意到这里预先给10 个元素分配了空间。你也可以使用vector 提供的插入函数来动态的扩

展容器。成员函数push_back()就在vector 的尾部添加了一个元素:

v.push_back(3);

也可以用insert()函数完成同样的工作:

v.insert(v.end(), 3);

这里insert()成员函数需要两个参数:一个指向容器中指定位置的迭代器(iterator),一个待插

入的元素。insert()将元素插入到迭代器指定元素之前。

现在对迭代器(Iterator)做点解释。Iterator 是指针(pointer)的泛化,iterator 要求定义

operator*,它返回指定类型的值。Iterator 常常和容器联系在一起。例子:

vector<int> v(3);

v[0] = 5;

v[1] = 2;

v[2] = 7;

 

vector<int>::iterator first = v.begin();

vector<int>::iterator last = v.end();

while (first != last)

cout << *first++ << “ “;

上面代码的输出是:

5 2 7

begin()返回的是vector 中第一个元素的iterator,而end()返回的并不是最后一个元素的

iterator,而是past the last element。在STL 中叫past-the-end iterator

组合查找
vector<int>::iterator result = find( v.begin( ), v.end( ), 2 ); //查找2
if ( result == v.end( ) ) //没找到
        cout << "No" << endl;
 else //找到
        cout << "Yes" << endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现特殊分隔符无法分隔解决方案

今天处理文本数据时候遇到这种文本用空格和tab正则匹配没有作用&#xff0c;后来问了同事发现可以用“\\uf8f5”去匹配。 待处理文本&#xff1a; A abbr.安  A-10IInone.美空军主力近距离空中支援攻击机&#xff0c;无愧为“坦克杀手”。 A-12none.夭折的美海…

java英文单词单复数转换

package steam;import java.util.*; import java.util.regex.*; /*** * 单复数转换类* 2018年12月30日*/public class Inflector {private static final Pattern UNDERSCORE_PATTERN_1 Pattern.compile("([A-Z])([A-Z][a-z])");private static final Pattern UNDERS…

最全英语单词下载地址

这两天搜集英文单词做词干化处理&#xff0c;虽说standford-NLP可以处理&#xff0c;但是效率不高&#xff0c;自己动手找单词做映射表&#xff0c;找单词真的痛苦&#xff01;&#xff01;&#xff01;放出以下地址最为保存和分享 github&#xff1a; https://github.com/dw…

NLP英文缩写词性含义

1. CC Coordinating conjunction 连接词 2. CD Cardinal number 基数词 3. DT Determiner 限定词&#xff08;如this,that,these,those,such&#xff0c;不定限定词&#xff1a;no,some,any,each,every,enough,either,neither,all,both,half,sever…

redis通过expire设置存活期注意问题

今天老大检查之前所做的项目发现项目过期数据仍然残留并没有删除&#xff0c;本以为自己设置了存活期就不用管数据了会自动删除掉&#xff0c;啊&#xff0c;果然自己太马虎了&#xff0c;如果是传统的kv类型&#xff0c;通过expire(key&#xff0c;alive_time)没有错误&#x…

次幂函数取模算法

次幂函数取模算法 高次幂函数取模算法 在平常的工作学习中&#xff0c;我们经常需要用到求取一个数字或者幂运算的余数&#xff0c;尤其在密码学中最为常用的RSA算法就经常要用到这种运算&#xff0c;我们称之为高次幂函数的取模运算。 在本篇文章中&#xff0c;将会首先介绍运…

【转载保存】接口压力测试安装与使用

https://blog.csdn.net/qq_26525215/article/details/79182674

mysql日期格式转换

select * from news where DATE_FORMAT(news_time, %Y-%m-%d %k:%i:%s) < " "" curDate "

java单例模式双重检查

public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton null) {synchronized (Singleton.class) {if (singleton null) {singleton new Singleton();}}}return singleton;} }

mysql 常用操作

mysql 常用操作&#xff08;整理&#xff09; 标签&#xff1a; MYSQL常用操作 2013-07-22 16:37 10846人阅读 评论(0) 收藏 举报 本文章已收录于&#xff1a; 分类&#xff1a; MYSQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[]…

协同过滤算法UserCF和ItemCF优缺点对比

UserCF&#xff1a; 性能&#xff1a;适用于用户较少的场合&#xff0c;如果用户很多&#xff0c;计算用户相似度矩阵代价很大。领域&#xff1a;时效性较强&#xff0c;用户个性化兴趣不太明显的领域。实时性&#xff1a;用户有新行为&#xff0c;不一定造成推荐结果的立即变…

deque

STL之deque容器详解Deque 容器 deque容器是C标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似&#xff0c;支持随机访问和快速插入删除&#xff0c;它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是&#xff0c;deque还支持从…

【转载保存】MySQL时间、字符串、时间戳互相转换

时间转字符串 select date_format(now(), ‘%Y-%m-%d %H:%i:%s’); 结果&#xff1a;2018-05-02 20:24:10 时间转时间戳 select unix_timestamp(now()); 结果&#xff1a;1525263383 字符串转时间 select str_to_date(‘2018-05-02’, ‘%Y-%m-%d %H’); 结果&#xff1a;20…

RMQ算法,求区间最值

poj 3264 Balanced Lineup 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报分类&#xff1a;RMQ(Range MinimumMaximum Quer)&#xff08;4&#xff09; Balanced LineupTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 45854 Accepted: 21536Case Time Limit: 2000M…

【转载】向量空间模型VSM及余弦计算

向量空间模型VSM及余弦计算 向量空间模型的基本思想是把文档简化为以特征项&#xff08;关键词&#xff09;的权重为分量的N维向量表示。 这个模型假设词与词间不相关&#xff08;这个前提造成这个模型无法进行语义相关的判断&#xff0c;向量空间模型的缺点在于关键词之间的…

机器学习入门学习视频和书籍(笔记保存)

我娜姐推荐的资料和我要看的资料记录下&#xff1a; 吴恩达151课时:https://study.163.com/course/courseLearn.htm?courseId1004570029#/learn/video?lessonId1049052745&courseId1004570029机器学习书籍&#xff1a;《Machine Learning in Action》,Peter Harington&a…

【美文保存】nosql数据库对比以及如何巧妙利用redis来提高效率?

1. MySqlMemcached架构的问题 实际MySQL是适合进行海量数据存储的&#xff0c;通过Memcached将热点数据加载到cache&#xff0c;加速访问&#xff0c;很多公司都曾经使用过这样的架构&#xff0c;但随着业务数据量的不断增加&#xff0c;和访问量的持续增长&#xff0c;我们遇…

嵌入式开发——DMA外设到内存

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 uint8_t data; 串口接收(&data);data有数据了 实现串口的数据接收,要求采用dma的方式。 数据交互流程 CPU配置好DMA外…

系统设计类问题

如果让你设计一个秒杀系统&#xff0c;你会如何设计&#xff1f; Redis是一个分布式缓存系统&#xff0c;支持多种数据结构&#xff0c;我们可以利用Redis轻松实现一个强大的秒杀系统。 我们可以采用Redis 最简单的key-value数据结构&#xff0c;用一个原子类型的变量值(Atomic…

B - Ada and Queue

Ada the Ladybug has many things to do. She puts them into her queue. Anyway she is very indecisive, so sometime she uses the top, sometime the back and sometime she decides to reverses it. Input The first line consists of 1 ≤ Q ≤ 106, number of queries…