首页 > 代码库 > bk-02 C++ vector用法 博客园
bk-02 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
? 下一篇:C++ string
有个this指针,代表调用这个函数的对象
是结构体内的函数本身有的一个属性吗?
(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;
}
废话,都到vec.end()了,还要+j,想想 vec.end()+j 都是错的。
这是因为 C++ 对 struct 的处理和 class 一样,同样允许有成员函数,那么自然也会有 this 指针。
比较器,本来默认是从小到大排序,使用了自己的比较器之后可以改变它的排序方式。换而言之,即使把默认的比较方式换成了你自己的
【免费】自开发零实施的H3 BPM免费下载
【推荐】Google+GitHub联手打造前端工程师课程
【云上】在金山大米云,让云计算更简单
【推荐】阿里云香港云服务器65折,免备案
· 李彦宏跑到硅谷与百度团队做交流 打破限制出境传闻
· 要全民卖手机,拿下农村市场,小米这次拼了!
· 微软员工取笑川普顾问“微波炉可变身摄像头”言论
· AppleCare+购买期限延长:买iPhone之日起1年内
· 树莓派五年卖出超过1250万块,成世界第三大计算机平台
? 更多新闻...
· 垃圾回收原来是这么回事
· 「代码家」的学习过程和学习经验分享
· 写给未来的程序媛
· 高质量的工程代码为什么难写
园龄:5年10个月
粉丝:164
关注:6
搜索
随笔分类(173)
- .Net(25)
- C#(23)
- Debug(18)
- Entity Framework(5)
- Html/CSS(6)
- IO(2)
- Java(1)
- javascript 2.0完全参考手册第二版(7)
- JS(21)
- Sql Server(16)
- 产品
- 常用函数(3)
- 大话设计模式(2)
- 锋利的Jquery(第2版)学习笔记(6)
- 工作经验(4)
- 爬虫(5)
- 任务总结(3)
- 数据结构与算法(9)
- 网络编程(7)
- 业余扩展(3)
- 有关学习(3)
- 源程序分析(2)
- 知识总结与交流(2)
文章分类(28)
- asp.net(5)
- C#(1)
- JS/JQuery/Ajax/Json(4)
- SQL(3)
- 常用类总结(5)
- 工作经验(6)
- 黑客技术(3)
- 数据结构和算法(1)
最新评论
- 1. Re:小议如何绕开验证码(原理)
- 22525252525
- 2. Re:小议如何绕开验证码(原理)
- 8858
- 3. Re:小议如何绕开验证码(原理)
- 5525626260
- 4. Re:小议如何绕开验证码(原理)
- 20202020320202020
- 5. Re:小议如何绕开验证码(原理)
- 02020202020202020202020202020
bk-02 C++ vector用法 博客园