STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序。编译环境是VC6.0
这个程序使用了vector的两种赋值方式,遍历,查找,删除,自定义排序。希望对看到此文的同学有所帮助。
另外,一定要引如using namespace std; 否则后面老是要写std::vector<int> 很麻烦的。
assert.h不是必须的,这里只不过用了一下而已,它是和assert()函数的头文件。
algorithm头文件不可少,因为sort,find这两个函数实在这个头文件中。
#include <vector>
#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;
//把 vector<int>定义成这个 INTVECTOR 为了后面写着方便
typedef vector<int> INTVECTOR;
//排序函数按降序输出
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
int a[6] = {1, 5, 3, 8, 0, -1};
//给vector<int>赋值,方法一
//INTVECTOR vi(a, a + sizeof(a)/sizeof(int));//sizeof(a)/sizeof(int)求数组的大小
//给vector<int>赋值,方法二
INTVECTOR vi;
for (int i = 0; i < 6; i++)
vi.push_back(a[i]);
//遍历
cout << "遍历" << endl;
INTVECTOR::iterator ite;
for (ite = vi.begin(); ite != vi.end(); ite++)
{
cout << *ite << " ";
}
cout << endl;
//查找,find函数需要引入#include <algorithm>
cout << "查找5" << endl;
ite = find(vi.begin() , vi.end(), 5);
assert(ite != vi.end());
//删除
cout << "删除" << *ite << endl ; //返回容器内找到值的位置。
vi.erase(ite);
cout << "删除后遍历" << endl;
for (ite = vi.begin(); ite != vi.end(); ite++)
{
cout << *ite << " ";
}
cout << endl;
//排序,sort函数需要引入#include <algorithm>
//sort函数有两种写法,一种是默认升序,
//另外一种需要定义一个cmp函数。
cout << "排序" <<endl;
sort(vi.begin(), vi.end(), cmp);
for (ite = vi.begin(); ite != vi.end(); ite++)
{
cout << *ite << " ";
}
cout << endl;
//如果想定义比较复杂的cmp请参考
//http://hi.baidu.com/topman3758/blog/item/859b18da6222623933fa1cd8.html
return 0;
}
假设自己定义了一个结构体node
struct node{
int a;
int b;
double c;
}
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
{
if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;
return return x.c>y.c;
} 排序时写sort(arr,a+100,cmp);
最后看一个完整的实例,初赛时的一道题目“文件名排序 ”。
以下是代码片段:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")
struct node{
string a,b;
};
//ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z'
//而这题要求忽略大小写,所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思
//先把两个字符串全部转化为小写,再比较大小(字典序)
bool lt(string x,string y)
{
int i;
for(i=0;i<x.length();i++)
if(x[i]>='A'&&x[i]<='Z')
x[i]='a'+(x[i]-'A');
for(i=0;i<y.length();i++)
if(y[i]>='A'&&y[i]<='Z')
y[i]='a'+(y[i]-'A');
return x<y;
}
//自定义的比较函数,先按b值升序排列(也就是"Dir"排在"File"前面)
//如果b值相同,再按a升序排列,用的是刚才定义的lt函数
bool comp(node x,node y)
{
if(x.b!=y.b)return x.b<y.b;
return lt(x.a,y.a);
}
int main()
{
node arr[10001];
int size=0;
while(cin>>arr[size].a>>arr[size].b)
size++;
sort(arr,arr+size,comp);
for(int i=0;i<size;i++)
cout<<arr[i].a<<" "<<arr[i].b<<endl;
return 0;
}
原地址:http://hi.baidu.com/ozwarld/item/68656be6ae00663f4ddcaf87
STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase的更多相关文章
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- Java中list如何利用遍历进行删除操作
转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874 Java三种遍历如何进行list的便利删除: 1.f ...
- C++ STL中vector(向量容器)使用简单介绍
原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...
- 【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结
#include<iostream> #include<cstdio> #include<string> #include<vector>//不定长数组 ...
- STL中 vector 和 list 一些特性
STL中的vector特点是: 其容量在需要时可以自动分配,本质上是数组形式的存储方式.即在索引可以在常数时间内完成.缺点是在插入或者删除一项时,需要线性时间.但是在尾部插入或者删除,是常数时间的. ...
- 007_对go语言中的自定义排序sort的小练习
在go语言基础知识中,有个知识点是go语言的自定义排序,我在学习完之后,自己做了一些小练习和总结. 首先按照惯例,还是呈上代码演示: package main import "fmt&quo ...
- STL中vector,Map,Set的实现原理
vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元 ...
随机推荐
- 一个大学生屌丝心中的seo梦
最 近这几天,我利用空闲时间去网上看到很多关于seoer的生存现状,尤为的感伤.因为自已也是一位爱好seo和利用闲于时间来学习seo的一个大学生屌 丝,在学习的过程中,有辛酸和泪水.但也有快乐,感觉一 ...
- perl 当前包会覆盖父类的同名方法
12.5.2 访问被覆盖的方法: 当一个类定义一个方法,那么该子过程覆盖任意基类中同名的方法. [root@wx03 test]# cat Horse.pm package Horse; our @I ...
- linux 下启动jar小程序
下面是我的三个可运行jar程序 1.启动 采集话单文件应用程序 nohup java -jar gather.jar > logs/gather/console.out & 2.启动 ...
- 带dos调试窗口的win32程序
#pragma comment( linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\&quo ...
- 基于visual Studio2013解决C语言竞赛题之1080填运算符
题目 解决代码及点评 /************************************************************************/ /* ...
- 创建了一个基于最短路径规划geoserver的wms服务
两点之间的文章书面请求随机最短路径sql功能,这篇文章是关于如何将上述到系统中的子功能. 1.geoserver登录 首先单击geoserver安装路径下的start Geoserver 待geose ...
- 九道大型软件公司.net面试题!一定得看(附答案)
1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换 2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组 3:请简述面向 ...
- Oracle左连接、右连接示例
建表: create table a ( id ), name ) ); create table b ( name ), age ) ); create table c ( name ), dept ...
- 我在使用的Chrome插件
首先本人为一名Android程序员,故下面的很多插件很多都是关于开发辅助相关的.当然还有涉及到其他方面的插件,比如社交,浏览,工具等.以下按照字母排序. 1.AdBlock The most popu ...
- ProgressDialog使用汇总
ProgressDialog使用 ProgressDialog 从继承AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口. ProgressDi ...