STL之vector的使用一(初始化vector)

2023-11-12

简介:vector可用于代替C中的数组,或者MFC中的CArray,从许多说明文档或者网上评论,一般一致认为应该多用vector,因为它的效率更高,而且具备很好的异常安全性。而且vector是STL推荐使用的默认容器,除非你知道你有特殊需要,使用vector不能满足你的需求,例如需要容器在head和tail高效的插入和删除,或者在任何位置高效的删除和插入操作,那么你可能使用deque或者list更加合适。

vector是连续内存容器,换句话说,标准要求所有标准库实现的时候,vector中的元素的内存必须是连续的。所以对于插入和删除的时间复杂度是很高的,因为删除或者插入的时候,需要元素的移动,即元素复制拷贝。

vector的内部实现一般需要用到placement new ,所以效率很高,因为很多的时候,只要我们是使用得到,就可以省去很多的内存分配开销。而且vector的使用,元素可以没有默认的构造函数,但是需要拷贝构造函数的存在,这是使用CArray所无法实现的。

使用原则:

  1. 尽量使用vector代替C风格的数组或者CArray;
  2. 尽量使用算法代替手工写的循环;
  3. 尽量使用vector本身的函数代替其他泛型算法;

vector的接口很容易看懂和使用,这里以一些例子来说明vector的用法。

1,填充vector

如果我们想用原始数组的内容填充vector,那么于有很多种方式。我们来一次学习vector的几个方法。

例如我们有数组int  v1[10] = {0,1,0,0,3,0,0,4,4,4};

初始化方式1:

1 vector<int> v2(10); //初始化size为10可以避免数组动态增长的时候不断的分配内存
2 //v2.reserve(10);//同上,只要使用其中一个就可以了
3 forint i=0; i<10; i++ )
4 {
5 v2.push_back(v1[i]);//增加一个元素
6 }

初始化方式2:

1 vector<int> v3(&v1[0],&v1[9]);//原始数组的元素指针可以作为迭代器来使用

初始化方式3:

1 vector<int> v4;
2 v4.reserve(10);
3 v4.insert(v4.begin(), &v1[0], &v[9]);

初始化方式4:

1 vector<int> v5(10);
2 copy(v5.begin(), &v1[0], &v1[9]);

原始数组的元素指针可以作为迭代器来使用。

原则:尽量使用reserve来减少不必要的内存分配次数。

原则:尽量使用empty而不是size()==0 来判断容器是否为空

有可能我们需要在vector中插入相应的元素

1 vector<int>::iterator i = find( v1.begin(), v1.end(), 3);
2 if( i != v1.end() )
3 {
4 v1.insert( i, 6 );
5 }
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

void print(int i)
{
	printf("%d ", i);
}

int main()
{
	vector<int> v;
	v.reserve(10);
	
	for (int i=4; i<14; i++)
		v.push_back(i);
	vector<int> :: iterator it = find(v.begin(), v.end(), 5);	
	for_each(v.begin(), v.end(), print);
	if (it != v.end())
		v.insert(it, 33);//插入后,迭代器失效 
	printf("\n");
	for_each(v.begin(), v.end(), print);
	printf("\n");
	vector<int> :: iterator tt = find(v.begin(), v.end(), 5); 
	if (tt != v.end())
		v.erase(tt);//删除后,迭代器失效 
	for_each(v.begin(), v.end(), print);
	printf("\n");
	v.erase(remove(v.begin(), v.end(), 33), v.end());
	for_each(v.begin(), v.end(), print);
	
	return 0;
}



原创文章,转载请注明: 转载自C/C++程序员之家

本文链接地址: STL之vector的使用一(初始化vector)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL之vector的使用一(初始化vector) 的相关文章

  • codeforces 851 #432 div2 C Five Dimensional Points

    Problem codeforces com contest 851 problem C Preference Codeforces Round 432 editorial Codeforces Round 432 Div 2 C Five
  • 2022十三届蓝桥杯国赛题解

    特此声明 本文仅为参考文档 标准答案请参考官方文档 试题A 该题是一道背包dp题 我的思路是定义三维dp 第一维表示第i个数 第二维表示前i个数的总和为j 第三维表示前i个数 总和为j 第i个数为z的方案数 首先观察这个题的性质 要求互不相
  • 第八十七题 UVa12166 Equilibrium Mobile

    A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium It consists of a n
  • 素数打表,复杂度(Onlogn)和O(n)(对与10^7来说线性快两倍) + 分解质因数

    代码 接口 primeInit 100000 打表的范围 素数存在primeList中 个数为primeCount typedef long long LL int const MAXN 10000100 bool isPrime MAXN
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Meaning 一个 N N 的矩阵 A 初始时全部值为 0 有两种操作 1 C x1 y1 x2 y2
  • 首字母变大写

    小写字母变大写m 0 m 0 32 include
  • hdu 1069 Monkey and Banana

    Problem acm hdu edu cn showproblem php pid 1069 Reference www cnblogs com kuangbin archive 2011 08 04 2127291 html 题意 给
  • hdu 5818 Joint Stacks 2016 Multi-University 7

    Problem acm hdu edu cn showproblem php pid 5818 官方题解 bestcoder hdu edu cn blog 2016 multi university training contest 7
  • poj 1195 Mobile phones

    Problem poj org problem id 1195 vjudge net contest 146952 problem C Meaning 有一个 S S 的正方形区域 两维的下标范围都是是 0 S 1 有 4 种操作 1 0
  • stl_set

    begin 返回指向第一个元素的 迭代器 clear 清除所有元素 size 集合中元素的数目 count 返回某个值元素的个数 empty 如果集合为空 返回true 真 end 返回指向最后一个元素之后的迭代器 不是最后一个元素器 in
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • 三种寻找最长递增(减)子序列的方法【LIS】

    最长递增 减 子序列 LIS 三种解法 问题 给定一个序列data 1 6 2 5 7 9 求出他的的最长递增子序列 容易看出为 1 2 5 7 9 长度为5 同时这种问题还有一些衍生问法如 最长非递增 减 增子序列 最长递减子序列等解法都
  • HDU1007(最近点对问题)

    题意不难理解 就是找到最近的两个点 计算其距离 除以2就是所求的圆的半径 思路很简单 运用分治的思想 先划分区间 分别找到左右区间中的最近点对 再合并区间 找到区间间的最近点对 注意如果用qsort 进行排序可能会超时 include
  • gym 101505 CTU Open Contest 2016 G Orchard Division

    Problem codeforces com gym 101505 attachments vjudge net contest 187874 problem G Meaning 一个 m m 的网格 长 宽下标 0 m 1 里有 n 个点
  • ACM-子串(字符串处理)

    问题描述 有一些由英文字符组成的大小写敏感的字符串 请写一个程序 找到一个最长的字符串 x 使得 对于已经给出的字符串中的任意一个 y x 或者是 y 的子串 或者 x 中的字符反序之后得到的新字符串是 y 的子串 输入数据 输入 输入的第
  • hduoj 2010

    水仙花数 Problem Description 春天是鲜花的季节 水仙花就是其中最迷人的代表 数学上有个水仙花数 他是这样定义的 水仙花数 是指一个三位数 它的各位数字的立方和等于其本身 比如 153 1 3 5 3 3 3 现在要求输出
  • UVa 12504 Updating a Dictionary

    Problem uva onlinejudge org index php option com onlinejudge Itemid 8 page show problem problem 3948 题意 貌似是模拟 Source Cod
  • Ugly Numbers

    题目描述 Ugly numbers are numbers whose only prime factors are 2 3 or 5 The sequence 1 2 3 4 5 6 8 9 10 12 shows the first 1
  • 蓝桥杯 填字母游戏(博弈论)

    小明经常玩 LOL 游戏上瘾 一次他想挑战K大师 不料K大师说 我们先来玩个空格填字母的游戏 要是你不能赢我 就再别玩LOL了 K大师在纸上画了一行n个格子 要小明和他交替往其中填入字母 并且 1 轮到某人填的时候 只能在某个空格中填入L或
  • 杭电ACM 1004题

    原题大概意思就是统计输入字符串中 重复的最大个数 import java util Scanner public class Main public static void main String args Scanner sc new S

随机推荐

  • 模糊二维码数据集_CVPR 2019

    图像模糊是影响图像质量的重要因素 显着降低了许多计算机视觉应用的性能 例如物体检测和人脸识别 随着深度神经网络的发展 计算机视觉领域的难题被一个个解决 单纯依靠先验核去实现图像去模糊的技术已经渐渐被取代 本文将针对 CVPR2019 Uns
  • ChatGLM模型(服务器部署+微调)

    一 ChatGLM 6B在Linux上部署运行 1 部署 2 微调 3 推理 4 利用微调后的模型进行验证 5 参考博客 ChatGLM官方源码github地址 模型huggface地址 1 部署 1 1 部署前要先安装anaconda 我
  • yum安装软件时,出现"No package XXX available"的解决办法

    我的Linux版本6 8x64 依次执行以下命令解决 cd home wget http dl fedoraproject org pub epel 6 x86 64 epel release 6 8 noarch rpm rpm ivh
  • 6 FPGA时序约束理论篇之xdc约束优先级

    xdc约束优先级 在xdc文件中 按约束的先后顺序依次被执行 因此 针对同一个时钟的不同约束 只有最后一条约束生效 虽然执行顺序是从前到后 但优先级却不同 就像四则运算一样 x 都是按照从左到右的顺序执行 但x 的优先级比 要高 时序例外的
  • PCB设计中电流与线宽的关系

    除了温度 PCB的导线电流主要与铺铜厚度和线宽有关 嘉立创铺铜厚度为 1 盎司 0 0014 英寸 0 0356 毫米 mm 35 6um 1mm大约为40mil 40mil线宽三种铜厚情况下的电流大小为 35um 2 3A 50um 2
  • 启用计算机的fn键,联想 ThinkPad 笔记本 Fn 键 关闭与启用方法

    为适应部分用户的传统使用习惯 采用媒体功能键设计的笔记本电脑 BIOS中一般预留了热键模式切换开关 可通过切换开关来满足个人使用需要 1 电脑关机状态下 按下一键恢复按键 目前销售的联想笔记本电脑中 一键恢复按键多在电脑右侧 或左侧 以凹陷
  • first season fifteenth episode,does Chandler have dreams?

    Scene Central Perk Rachel is serving Joey Ross and Monica their drinks Rachel to Joey Coffee Hands it to him Joey Thank
  • 解决linux系统nginx重启失败问题

    端口被占用问题 nginx的默认端口为80端口 当我们的80端口被占用时 nginx无法启动成功 这时我们可以使用命令 netstat an grep 80 查看80端口的占用情况 于是 我们需要修改nginx的默认端口 通过命令进入ngi
  • “泰迪杯”数据分析职业技能大赛B题 学生校园消费行为分析---复盘

    1 赛题背景 校园一卡通是集身份认证 金融消费 数据共享等多项功能于一体的信息集成系统 在为师生提供优质 高效信息化服务的同时 系统自身也积累了大量的历史记录 其中蕴含着学生的消费行为以及学校食堂等各部门的运行状况等信息 很多高校基于校园一
  • EasyRecovery易恢复2023最新免费的电脑数据恢复软件

    EasyRecovery是一款非常专业的硬盘数据恢复工具 EasyRecovery拥有磁盘诊断 数据恢复 文件修复 E mail 修复等功能 有了EasyRecovery 你可以把误删 被破坏的文件 格式化的磁盘轻轻松松的找回来 小伙伴们可
  • AD如何修改3D视图时PCB板的颜色

    文章目录 前言 一 解决步骤 总结 前言 众所周知 AD 3D视图下默认是绿色板子 那我想改成其他颜色怎么办 一 解决步骤 其实很简单哈 我们就用最直接的方法 我们点击右下角这个LS旁边的红色框 注意不是点击LS哈 然后单击这两个绿色格子
  • 最全DOS的CMD命令,程序员必会

    转载 列宁的著作2021 09 05 10 54 16 文章标签DOSCMD命令行文件名实用程序文章分类代码人生阅读数207 CMD命令 开始 gt 运行 gt 键入cmd或command 在命令行里可以看到系统版本 文件系统版本 1 ap
  • Wget用法、参数解释的比较好的一个文章

    wget是一个从网络上自动下载文件的自由工具 它支持HTTP HTTPS和FTP协议 可以使用HTTP代理 所谓的自动下载是指 wget可以在用户退出系统的之后在后台执行 这意味这你可以登录系统 启动一个wget下载任务 然后退出系统 wg
  • FI(财务会计)模块简介

    一 财务会计系统主要特征及模型 一个有效的 现代的财务会计系统必须满足内部的和法定的会计面的要求 法定会计必须能够按有关规定向股东 债权人 劳工组织以及社会公众披露并提供所需的信息 而有效的公司管理会计必须包括控制和转移的功能 1 系统主要
  • 正确认识及掌握时间的用法

    前言 时间是一个相对地区而言的概念 因此有一个基准地区 就是本初子午线穿过的地区 了解世界时间相关的概念可以更好地协调全球人们的活动 便于跨越不同地区的时差 本初子午线 本初子午线指的是经过地球上经度为0度的那条线 也是国际日期变更线的起点
  • 亲密关系沟通-【情感勒索】建立良性沟通

    尊重对方的情绪 也应该判断对方的情绪是否合理 生活中情感勒索是很常见的 想要控制对方 我们可能都有做过这些行为 case 父母催婚 说女儿不孝顺 拒绝吃饭 情感勒索 case 男朋友不允许自己参加社团活动 不允许和其他男生接触 否则有自残行
  • G1垃圾收集器jvm参数设置

    堆内存最大最小值为4g 新生代内存2g Xms4g Xmx4g Xmn2g 元空间128m 最大320m XX MetaspaceSize 128m XX MaxMetaspaceSize 320m 开启远程debug Xdebug Xru
  • Java NIO(非阻塞IO) API介绍 .

    转载自 http blog csdn net daijialin article details 231384 在JDK 1 4以前 Java的IO操作集中在java io这个包中 是基于流的阻塞 blocking API 对于大多数应用来
  • 杭电OJ_(2043)密码

    Problem Description 网上流传一句话 常在网上飘啊 哪能不挨刀啊 其实要想能安安心心地上网其实也不难 学点安全知识就可以 首先 我们就要设置一个安全的密码 那什么样的密码才叫安全的呢 一般来说一个比较安全的密码至少应该满足
  • STL之vector的使用一(初始化vector)

    简介 vector可用于代替C中的数组 或者MFC中的CArray 从许多说明文档或者网上评论 一般一致认为应该多用vector 因为它的效率更高 而且具备很好的异常安全性 而且vector是STL推荐使用的默认容器 除非你知道你有特殊需要