c++swap函数怎么用,swap在c语言中的用法

  c++swap函数怎么用,swap在c语言中的用法

  a)排序功能的使用

  软件列表

  排序阻止列表

  排序子名称列表

  以上三种方式都可以使用Sort。对列表进行排序并返回排序后的列表。如果忽略SUBNAME或BLOCK,则按照标准字符串的比较顺序进行排序。例如,以ASCII顺序。如果指定了SUBNAME,那么这实际上是一个子函数的名称,它比较两个列表元素并返回一个小于、等于或大于0的整数,这取决于元素的排序顺序(升序、相同或降序)。您还可以提供BLOCK作为匿名子函数,而不是SUBNAME。效果是一样的。

  比较的两个元素临时分配给变量$a和$b。请不要修改$a或$ b,因为它们是通过引用传递的。使用子函数时,它不能是递归函数。

  2)使用方法示例

  1.按数字顺序排序

  @array=(8、2、32、1、4、16);

  Print(,sort) $a=$b) @array), \ n ;

  打印结果如下。

  1 2 4 8 16 32

  和那个一样:

  sub数字{ $ a=$ b };

  Print(,按数字排序@array), \ n ;

  这个很好理解。按自然数的顺序排序就行,不用细说。

  2.1按ascii顺序排序(不是字典顺序)

  @ languages=qw(forward lispcperlpythonjava);

  打印join(,sort @languages)、(n);

  打印结果:

  Perl c c fortran java lisp python

  这与下面的相同

  Print(,sort) $aCMP$b) @Languages), \ n ;

  即使按ASCII顺序排序,也不会说什么。

  请注意,按ASCII顺序对数字进行排序可能会导致与预期不同的结果:

  打印(,排序1。11), \ n ;

  1 10 11 2 3 4 5 6 7 8 9

  2.2字典顺序排序

  本地用户;

  @ array=qw(asciiascapat _ largeatlargeaarp);

  @ sorted=sort { $ da=LC $ a }=~ s/[/w _]/g;

  ($ db=LC $ b)=to=~ s/[/w _]//g;

  $ da cmp $ db

  } @ array

  打印 @ sorted \ n ;

  打印结果如下。

  aarparpascapasciiatlargeat _ large

  使用位置是可选的。如果原始数据包含国际字符,代码兼容性将得到改善。使用区域设置会影响cmp、lt、le、ge、gt和其他几个函数的操作属性。有关更多信息,请参见perllocale中的手册页。

  注意,atlarge和at_large的顺序在输出时是颠倒的。但是,排序的顺序是一样的。sort的中间子函数删除at_large的中间下划线。这可能是因为该示例运行在perl 5.005_02上。在Perl版之前,sort函数不保护具有相同值的键的优先级。Perl 5.6或更高版本保护这个顺序。

  请注意。无论是map、grep还是sort,这个临时变量$ _(sort中的$a和$b)的值都必须受到保护,不能更改。

  这段代码在对$a或$ b执行替换操作s/[/W_] //g之前重新赋值$da和$db,这样,替换操作就不会修改原来的元素。

  3.因为降序排序降序排序更简单,只需要把cmp或=前后操作数的位置交换一下就可以了。

  sort { $ b=$ a } @ array

  或者,改变中间块或子函数返回值的标志。

  sort {-$ a=$ b } @ array;

  或者,使用反向功能。这样做效率有点低,但可能容易读懂。

  反向排序{ $ a=$ b } @ array

  4.要使用多个关键字进行排序,您必须使用多个关键字进行排序。请将所有由or连接的比较操作放入一个子函数中。主要比较操作放在前面,次要操作放在后面。

  # anarrayofreferencestoanymoushashes

  @employees=(

  { FIRST=Bill ,

  LAST=盖茨,

  工资=600000,年龄=45 },

  { FIRST=mndhm ,LAST=Tester

  工资=55000,年龄=29 },

  { FIRST=Steve ,LAST=Ballmer ,

  工资=600000,年龄=41 }

  { FIRST=莎莉,LAST=开发者,

  工资=55000,年龄=29 },

  { FIRST=mldxwz ,LAST=Tester ,

  工资=55000,年龄=29 },

  );

  次级资历{

  $ b-{薪金}=$ a-{薪金}

  或者$b-{AGE}=$a-{AGE}

  或$a-{LAST} cmp $b-{LAST}

  或$a-{FIRST} cmp $b-{FIRST}

  }

  @ranked=sort资历@员工;

  foreach $emp (@ranked) {

  print $ EMP-{ SALARY }/t $ EMP-{ AGE }/t $ EMP-{ FIRST }

  $ EMP-{ LAST } \ n ;

  }

  打印结果是:

  60万45比尔盖茨

  史蒂夫鲍尔默

  55000 29莎莉开发商

  55000 29 mndhm测试仪

  55000 29 mldxwz测试仪

  上面的代码看起来很复杂,但实际上很容易理解。@employees数组的元素是匿名散列。匿名散列实际上是一个引用,它的值可以通过使用-操作符来访问。例如,$employees[0]-{SALARY}可以访问第一个匿名散列中对应于SALARY的值。所以上面的对比就很清楚了。先对比工资值,再对比年龄值,再对比LAST值,最后对比FIRST值。请注意,前两项按降序排列,后两项按升序排列。不要混淆。

  5.整理出一个新数组

  @x=qw(马特埃尔罗伊《美丽的面包莎莉》);

  @rank[sort { $x[$a] cmp $x[$b] } 0.$#x]=0.$ # x;

  打印 @ rank \ n ;

  打印结果是:

  2 0 1 3

  这里是不是有点混乱?仔细看就清楚了。0 .$#x是一个列表,它的值是@x数组的下标,这里是0 1 2 3。$x[$a] cmp $x[$b]是按照ASCII顺序比较@x中的元素。所以sort的结果返回一个@x的下标列表,排序标准是下标对应的@x元素的ASCII顺序。

  还是不明白sort返回什么?让我们首先打印出@x中元素的ASCII顺序:

  @x=qw(马特埃尔罗伊《美丽的面包莎莉》);

  打印联接 ,排序{ $ a CMP $ b } @ x;

  打印结果是:

  埃尔罗伊的漂亮面包马特莎莉

  它们在@x中对应的下标是1 2 0 3,所以上面排序返回的结果是1 2 0 3的列表。@rank[1 2 0 3]=0.$#x只是一个简单的数组赋值操作。

  所以@rank的结果是(2 0 1 3)。

  6.按键对哈希进行排序

  %hash=(Donald=Knuth,Alan=Turing,John=Neumann);

  @sorted=map { { ($_=$hash{$_}) } }排序关键字% hash

  foreach $hashref (@sorted) {

  ($key,$ value)=each % $ hashref;

  打印 $ key=$ value \ n ;

  }

  打印结果是:

  艾伦=图灵

  唐纳德=克努特

  约翰=纽曼

  上面的代码不难理解。排序关键字%hash以%hash的关键字的ASCII顺序返回一个列表,然后用map计算它。请注意,这里的map中使用了double {{}}。

  其中的{}是匿名hash,也就是说map的结果是匿名hash列表。明白了吗?

  所以@sorted数组中的元素是匿名散列,它们的键/值可以通过%$hashref反向引用来访问。

  7.按值对哈希进行排序

  %hash=( Elliot=Babbage,

  查尔斯=巴贝奇,

  Grace=Hopper,

  赫尔曼=霍尔瑞斯

  );

  @sorted=map { { ($_=$hash{$_}) } }

  排序{ $hash{$a} cmp $hash{$b}

  或$a cmp $b

  } keys % hash

  foreach $hashref (@sorted) {

  ($key,$ value)=each % $ hashref;

  打印 $ key=$ value \ n ;

  }

  打印结果是:

  查尔斯=巴贝奇

  埃利奥特=巴贝奇

  赫尔曼=霍尔瑞斯

  格雷斯=霍普

  与哈希键不同,我们不能保证哈希值的唯一性。如果只根据值对hash进行排序,那么当可爱的小鸟添加或删除其他值时,具有相同值的两个元素的排序顺序可能会发生变化。为了得到一个稳定的结果,我们应该把值排序为主,把键排序为从。

  这里{$ hash {$ a} CMP $ hash {$ b}或$ a CMP $ b}已经通过按value和键排序了两次。sort返回的结果是排序后的键列表,然后将该列表交给map进行计算,并返回一个匿名散列列表。接入方式和前面一样,不赘述。

  8.对文件中的单词进行排序,并删除重复的单词。

  perl -0777ane $,= \ n@ uniq { @ F }=();打印排序关键字%uniq 文件

  我们试试这个用法,但是我不太明白。

  @uniq{@F}=() hash slice用于创建hash,其键是文件中唯一的字;

  这种用法在语义上等同于$uniq{ $F[0],$F[1],$F[$#F]}=()

  这些选项描述如下:

  -0777-读入整个文件,而不是单行

  -a-自动拆分模式,将行拆分成@F数组

  -从命令行读取和运行脚本

  -n-逐行遍历文件:while () {.}

  $,-打印函数的输出域分隔符

  文件-文件名

  9.高效排序:Orcish算法和Schwartzian变换

  对于每个键,sort的子函数通常会被多次调用。如果非常在意排序运行时间,可以使用Orcish算法或者Schwartzian变换,这样每个键只计算一次。

  考虑下面的例子,它根据文件修改日期对文件列表进行排序。

  # Force算法-对每个文件多次访问磁盘

  @ sorted=sort {-M $ a=-M $ b } @文件名;

  # Orcish算法-在哈希中创建密钥

  @ sorted=sort {($ mod times { $ a } =-M $ a)=1

  ($modtimes{$b} =-M $b)

  } @文件名;

  非常聪明的算法,不是吗?因为文件的修改日期在脚本运行过程中基本不变,所以-M操作一次后保存就可以了。

  下面是施瓦茨变换的用法:

  @sorted=map( { $_-[0] }

  排序({ $a-[1]=$b-[1])

  映射({ [$_,-M]} @文件名)

  )

  );

  这种代码组合使用map,sort分为几层。记住我之前说的方法,从后往前看。Map({ [$_,-M]} @filenames)返回一个列表。列表的元素是匿名数组。匿名数组的第一个值是文件名,第二个值是文件的修改日期。

  排序({$a-[1]=$b-[1]).并对上面生成的匿名数组列表进行排序,按照文件的修改日期排序。

  sort返回的结果是排序后的匿名数组。

  最外面的地图({$_-[0]}.很简单,它从上面排序生成的匿名数组中提取文件名。这个文件名是根据修改日期排序的,每个文件只运行一次。

  这就是著名的施瓦茨变换,这种用法在国外的perl用户中非常流行。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: