今天学习网络编程,那个程序中利用了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的更多相关文章

  1. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  2. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  3. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  4. Java中list如何利用遍历进行删除操作

    转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874   Java三种遍历如何进行list的便利删除: 1.f ...

  5. C++ STL中vector(向量容器)使用简单介绍

    原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...

  6. 【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结

    #include<iostream> #include<cstdio> #include<string> #include<vector>//不定长数组 ...

  7. STL中 vector 和 list 一些特性

    STL中的vector特点是: 其容量在需要时可以自动分配,本质上是数组形式的存储方式.即在索引可以在常数时间内完成.缺点是在插入或者删除一项时,需要线性时间.但是在尾部插入或者删除,是常数时间的. ...

  8. 007_对go语言中的自定义排序sort的小练习

    在go语言基础知识中,有个知识点是go语言的自定义排序,我在学习完之后,自己做了一些小练习和总结. 首先按照惯例,还是呈上代码演示: package main import "fmt&quo ...

  9. STL中vector,Map,Set的实现原理

    vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元 ...

随机推荐

  1. 一个大学生屌丝心中的seo梦

    最 近这几天,我利用空闲时间去网上看到很多关于seoer的生存现状,尤为的感伤.因为自已也是一位爱好seo和利用闲于时间来学习seo的一个大学生屌 丝,在学习的过程中,有辛酸和泪水.但也有快乐,感觉一 ...

  2. perl 当前包会覆盖父类的同名方法

    12.5.2 访问被覆盖的方法: 当一个类定义一个方法,那么该子过程覆盖任意基类中同名的方法. [root@wx03 test]# cat Horse.pm package Horse; our @I ...

  3. linux 下启动jar小程序

    下面是我的三个可运行jar程序 1.启动 采集话单文件应用程序 nohup java -jar gather.jar > logs/gather/console.out & 2.启动   ...

  4. 带dos调试窗口的win32程序

    #pragma comment( linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\&quo ...

  5. 基于visual Studio2013解决C语言竞赛题之1080填运算符

        题目 解决代码及点评 /************************************************************************/ /* ...

  6. 创建了一个基于最短路径规划geoserver的wms服务

    两点之间的文章书面请求随机最短路径sql功能,这篇文章是关于如何将上述到系统中的子功能. 1.geoserver登录 首先单击geoserver安装路径下的start Geoserver 待geose ...

  7. 九道大型软件公司.net面试题!一定得看(附答案)

    1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换   2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组   3:请简述面向 ...

  8. Oracle左连接、右连接示例

    建表: create table a ( id ), name ) ); create table b ( name ), age ) ); create table c ( name ), dept ...

  9. 我在使用的Chrome插件

    首先本人为一名Android程序员,故下面的很多插件很多都是关于开发辅助相关的.当然还有涉及到其他方面的插件,比如社交,浏览,工具等.以下按照字母排序. 1.AdBlock The most popu ...

  10. ProgressDialog使用汇总

    ProgressDialog使用  ProgressDialog 从继承AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口. ProgressDi ...