bk-02 C++ vector用法 博客园

HappyWorking!

C++ vector用法

在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。

1 基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

2

vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

typedef struct rect
{
    int id;
    int length;
    int width;

  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。  bool operator< (const rect &a)  const    {        if(id!=a.id)            return id<a.id;        else        {            if(length!=a.length)                return length<a.length;            else                return width<a.width;        }    }
}Rect;

int main()
{
    vector<Rect> vec;
    Rect rect;
    rect.id=1;
    rect.length=2;
    rect.width=3;
    vec.push_back(rect);
    vector<Rect>::iterator it=vec.begin();
    cout<<(*it).id<<‘ ‘<<(*it).length<<‘ ‘<<(*it).width<<endl;    

return 0;

}

3  算法

(1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,

一般后一个都不包含.)

(2)使用sort排序:需要头文件#include<algorithm>,

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

定义排序比较函数:

bool Comp(const int &a,const int &b)
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。

分类: 数据结构与算法

好文要顶 关注我 收藏该文  



金河
关注 - 6
粉丝 - 164

+加关注

45

0

?上一篇:CSS学习笔记
?下一篇:C++ string

posted @ 2012-04-27 20:30 金河 阅读(386961) 评论(17) 编辑 收藏

评论列表

#1楼 2014-08-23 11:14 扛砖伯伯

这是我看过的最清晰的vector讲解了~我没明白那个结构体内部重载<的做法,函数的参数不是应该是两个吗?为什么会这样写?

支持(0)反对(0)

#2楼 2014-11-16 16:46 slowlyrun_boy

@ 扛砖伯伯
有个this指针,代表调用这个函数的对象

支持(0)反对(0)

#3楼 2014-11-23 20:19 扛砖伯伯

@ slowlyrun_boy
是结构体内的函数本身有的一个属性吗?

支持(1)反对(0)

#4楼 2015-03-30 14:57 Dingo妹

学习了!

支持(0)反对(0)

#5楼 2015-04-21 16:03 毛毛二号

非常感谢你的博客,受教了。但是我想还是提一个bug.你的文中,"
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始"
vec.erase(vec.begin()+i,vec.end()+j),应该是笔误。或者你想写的是
vec.erase(vec.begin()+i,vec.begin()+j)。我在测试你写的例子时发现的。如下:
#include<stdio.h>
#include<vector> 
#include<iostream>
using namespace std;
int main()
{
int i=0;
vector<int> vec;
for(i=0; i<10; i++)
{
vec.push_back(i);
}

for(unsigned int i=0; i<vec.size(); i++)
{
cout<<"初始化遍历:"<<vec[i]<<endl;
}

vector<int>::iterator it;
for(it = vec.begin(); it!=vec.end(); it++)
{
cout<<"迭代遍历:"<<*it<<endl;
}

vec.insert(vec.begin()+4,0);
for(unsigned int i=0; i<vec.size(); i++)
{
cout<<"插入遍历:"<<vec[i]<<endl;
}

vec.erase(vec.begin()+2);
for(unsigned int i=0; i<vec.size(); i++)
{
cout<<"擦除遍历:"<<vec[i]<<endl;
}
//vec.erase(vec.begin()+3,vec.end()+5);//调试报错。 改成如下就欧克 
vec.erase(vec.begin()+3,vec.begin()+5);

for(vector<int>::iterator it = vec.begin(); it!=vec.end(); it++)

cout<<"迭代遍历:"<<*it<<endl;
}

system("pause");
return 0;
}

支持(8)反对(0)

#6楼 2015-04-29 19:04 张京林要加油

你好,请问当我需要将一列数组排序然后得到他们原来的位置怎么办呢?大神有没有好一点方案啊

支持(0)反对(1)

#7楼 2015-07-22 16:26 _夏有乔木

@ 毛毛二号
废话,都到vec.end()了,还要+j,想想 vec.end()+j 都是错的。

支持(0)反对(3)

#8楼 2015-12-10 17:10 也许等直到

不没有看出你那个重载运算符起了什么作用

支持(0)反对(0)

#9楼 2016-01-21 09:57 sxb_201

棒!

支持(0)反对(0)

#10楼 2016-04-03 15:21 JRSmith

最后那个bool Comp函数是什么原理,没看懂,能不能麻烦解释下,谢谢了~

支持(0)反对(0)

#11楼 2016-05-19 13:44 Jacky_CN

@ 扛砖伯伯
这是因为 C++ 对 struct 的处理和 class 一样,同样允许有成员函数,那么自然也会有 this 指针。

支持(0)反对(0)

#12楼 2016-07-18 14:02 小默T

很有用

支持(0)反对(0)

#13楼 2016-08-25 10:34 zyysun

各路大神,那个比较重载函数什么作用?

支持(0)反对(0)

#14楼 2016-09-08 10:05 南理工14级第3组

学到了

支持(0)反对(0)

#15楼 2016-10-09 23:21 yybyyb

@ JRSmith
比较器,本来默认是从小到大排序,使用了自己的比较器之后可以改变它的排序方式。换而言之,即使把默认的比较方式换成了你自己的

支持(0)反对(0)

#16楼 2016-12-29 16:27 rosezp

谢谢博主!

支持(0)反对(0)

#17楼 2017-03-06 11:32 HDU李少帅

有没有pop() 函数

支持(0)反对(0)

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。

【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【免费】自开发零实施的H3 BPM免费下载
【推荐】Google+GitHub联手打造前端工程师课程
【云上】在金山大米云,让云计算更简单
【推荐】阿里云香港云服务器65折,免备案

最新IT新闻:
· 李彦宏跑到硅谷与百度团队做交流 打破限制出境传闻
· 要全民卖手机,拿下农村市场,小米这次拼了!
· 微软员工取笑川普顾问“微波炉可变身摄像头”言论
· AppleCare+购买期限延长:买iPhone之日起1年内
· 树莓派五年卖出超过1250万块,成世界第三大计算机平台
更多新闻...

最新知识库文章:

· 为什么我要写自己的框架?
· 垃圾回收原来是这么回事
· 「代码家」的学习过程和学习经验分享
· 写给未来的程序媛
· 高质量的工程代码为什么难写

更多知识库文章...

昵称:金河
园龄:5年10个月
粉丝:164
关注:6

+加关注

搜索

随笔分类(173)

文章分类(28)

最新评论

Copyright ?2017 金河

null

时间: 2024-08-03 21:11:33

bk-02 C++ vector用法 博客园的相关文章

JavaScript的基本用法--博客园老牛大讲堂

我最近总结了关于javaScript的用法,下面分享给大家--关注博客园老牛大讲堂 数组的用法: var arr=[10,1,66,55,100,5,2,7,1]; var arr1=[4,8,11]; console.log(arr.push(4,8,11));//添加末尾元素,返回数组的长度 console.log("末尾添加元素:"+arr); console.log(arr.unshift(4,8,11));//添加头元素,返回数组长度 console.log("开头

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1

简易nodejs爬虫抓取博客园指定用户的文章及浏览量

需要安装nodejs和cheerio模块 实现了自定义用户,自定义页数,抓取完毕自动停止无重复 可以按需修改文章类和评论的类名 用法: 首先 npm install cheerio 执行 node cnblog [username] 文件结果保存在res/cnblog.txt //cnblog.jsvar http = require('http') var fs = require('fs') var path = require('path') var cheerio = require('

C# 中使用System.Net.Http.HttpClient 模拟登录博客园 (GET/POST)

一. System.Net.Http.HttpClient简介 System.Net.Http 是微软.net4.5中推出的HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web Service 的客户端组件: 2. 能够同时在客户端与服务端同时使用的 HTTP 组件(比如处理 HTTP 标头和消息), 为客户端和服务端提供一致的编程模型. 个人看来是抄袭apache http client ,目前网上用的

python数据挖掘领域工具包 - wentingtu - 博客园

python数据挖掘领域工具包 - wentingtu - 博客园 python数据挖掘领域工具包 原文:http://qxde01.blog.163.com/blog/static/67335744201368101922991/ Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: 比较成熟的(广播)函数库: 用于整合C/C++和Fortran代码的工具包: 实用的线性代数.傅

iOS_CNBlog项目开发 (基于博客园api开发)

按照惯例, 先上效果图 前言 很巧, 做这个项目是因为刚好在逛博客园的时候看到一篇文章 博客园第三方客户端-i博客园正式发布App Store, 这里就帮忙贴下链接啦, 毕竟我是由此而想说做这个项目的. 然而更巧的是, 和那篇文章的作者一样, 我也是刚毕业要找实习的人了(/(ㄒoㄒ)/~~), 开发容易找工不易, 哎, 做个项目练练手吧. 然后, 整个项目做下来大概做了半个月吧, 今天算是做出1.0版本啦, 已经贴上github(https://github.com/samAroundGitHu

安卓开发笔记——打造属于自己的博客园APP(四)

在上篇文章<安卓开发笔记——打造属于自己的博客园APP(三)>中,我们对博客文章的详情页和评论页进行了实现,慢慢的一个APP已经出现雏形了,当然这只是完成了"表面效果",要真正做好一个APP并不是一件很轻松的事情,有很多细节需要我们一点一滴的去完善. 好了,来讲下今天要完成的效果,在优化了之前部分代码的前提下,今天来说下关于博客搜索和博客详情页的实现,依旧国际惯例,来看下效果图:(动态图片比较大,加载需要点时间) 效果比较简单,很多东西我们还是可以复用之前的代码,毕竟这种列

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型. Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文 1.前言 最新在公司做一个项目,需要一些文章类的数据,当时就想到了用网络爬虫去一些技术性的网站爬一些,当然我经常去的就是博客园,于是就有下面的这篇文章. 2.准备工作 我需要把我从博客园爬取的数据,保存起来,最好的方式当然是保存到数据库中去了,好了我们先建一个数据库,在来一张表,保存我们的数据,其实都很简单的了啊,如下图所示 BlogArticleId博文自增ID,BlogTitle博文标题,BlogUrl博文地