random_shuffle有兩種形式,即
專(zhuān)業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶(hù)和效益!成都創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!
templateclass?RandomAccessIterator
void?random_shuffle(RandomAccessIterator?first,?RandomAccessIterator?last);
和
templateclass?RandomAccessIterator,?class?RandomNumberGenerator
void?random_shuffle(RandomAccessIterator?first,?RandomAccessIterator?last,
RandomNumberGenerator?rnd);
二者被deprecated(即不推薦使用)的原因并不一樣。
前者使用編譯器指定的隨機(jī)數(shù)發(fā)生器來(lái)打亂數(shù)組的內(nèi)容,這個(gè)隨機(jī)數(shù)發(fā)生器通伏輪常是rand函數(shù),它被deprecated的鬧梁原因也和rand函數(shù)有關(guān)。由于rand函數(shù)是C語(yǔ)言的遺留產(chǎn)物,不同編譯器實(shí)現(xiàn)方法不一樣,產(chǎn)生隨機(jī)數(shù)的可靠性也千差萬(wàn)別,并且C++11提供了一整套明確規(guī)定了算法的隨機(jī)數(shù)發(fā)生器(位于random頭文件)。有人提議把rand函數(shù)標(biāo)為deprecated,來(lái)讓更多的人使用C++11提供的“更好的東西”。使用rand函數(shù)的random_shuffle也被連帶標(biāo)為deprecated。
后者要求rnd仿函數(shù)(只能是仿函數(shù)缺彎信)產(chǎn)生的隨機(jī)數(shù)的范圍就是數(shù)組的下標(biāo)范圍,這樣的仿函數(shù)通常不是很容易寫(xiě),完全可以被更好的東西代替——這個(gè)更好的東西就是shuffle函數(shù)
shuffle函數(shù)與random_shuffle的第二種形式相似,同樣是接受一個(gè)仿函數(shù),但對(duì)隨機(jī)數(shù)的范圍要求更松,因而可以直接傳一個(gè)std::mt19997對(duì)象,或者std::random_device對(duì)象(都是C++11直接提供的隨機(jī)數(shù)發(fā)生器)的進(jìn)去,更便于使用,同時(shí)不像rand一樣,不能保證打亂結(jié)果的可靠性
是void函數(shù)。
返回類(lèi)型,函數(shù)名在就是對(duì)于初學(xué)者要記住以后常用的幾種函數(shù)的實(shí)現(xiàn):比如排序,求公約數(shù),因?yàn)檫@些在以后的章節(jié)中的學(xué)習(xí)會(huì)經(jīng)常遇到。
在各類(lèi)編程語(yǔ)言中,函數(shù)是一種過(guò)程,也稱(chēng)為子程序,它執(zhí)行一個(gè)指定的運(yùn)算或操作。函數(shù)有內(nèi)部函數(shù)或稱(chēng)標(biāo)準(zhǔn)函數(shù),外部函慶或態(tài)數(shù)也即用戶(hù)定義函數(shù)等。能被譽(yù)源程序或主函數(shù)調(diào)用。C語(yǔ)言中,函數(shù)的形式分無(wú)參和有參兩類(lèi)。無(wú)參函數(shù)不帶回或帶回函數(shù)值。
閉包和高階函數(shù)
函數(shù)編程支持函數(shù)作為第一類(lèi)對(duì)象,有時(shí)稱(chēng)為閉包或者仿函數(shù)(functor)對(duì)象。實(shí)質(zhì)上,閉包是起函數(shù)的作用并可以像對(duì)象一樣操作的對(duì)象。與此類(lèi)似,F(xiàn)P 語(yǔ)言支持高階函數(shù)。高階函數(shù)可以用另一個(gè)函數(shù)(間接地,用一個(gè)表達(dá)式) 作為其輸入?yún)?shù),在某些情況下,它甚至返回一個(gè)函數(shù)作為其輸出參數(shù)。這兩種結(jié)構(gòu)結(jié)合在一起團(tuán)巖使得可以用優(yōu)雅的方式進(jìn)行模塊化編程,這是使用 FP 的最大好處。
數(shù)組的4種聲明方式:
1.先聲明再初始化
例如:
//1.聲明
int[] nums;
//初始化
nums = new int[5];
2.聲明并初始化
例如:
//2.聲明、初始化
int[] nums = new int[10];
3.創(chuàng)建數(shù)組同時(shí)賦值
例如:
//3.創(chuàng)建數(shù)組同時(shí)賦值
String[] names=new String[]{"大名","小米","夏雨荷"};
int[] ages=new int[]{21,22,21,56,13};
for (int i = 0;i names.length;i++){
System.out.prinrln(names[i]);
}
for (int i = 0;i ages.length;i++){
System.out.prinrln(ages[i]);
}
4.創(chuàng)建同時(shí)賦值,簡(jiǎn)寫(xiě),不能寫(xiě)成兩條語(yǔ)句
例如:
//4.創(chuàng)建同時(shí)賦值,簡(jiǎn)寫(xiě),不能寫(xiě)成兩條語(yǔ)句
String[] cities = {"上海","北京"};
擴(kuò)展資料:
數(shù)組(Array)是有序的元素序列。若將有限個(gè)類(lèi)型相同的變量的集合命名,那么這個(gè)名稱(chēng)為數(shù)組名。組成數(shù)組的各個(gè)變量稱(chēng)為數(shù)組的分量,也稱(chēng)為數(shù)組的元素,有時(shí)也稱(chēng)為下標(biāo)變量。用于區(qū)分?jǐn)?shù)組的各個(gè)元素的數(shù)字編號(hào)稱(chēng)為襲野仿下標(biāo)。數(shù)組是在程序設(shè)計(jì)中,為了處理方便, 把具有相同類(lèi)型的若干元素按有序的形式組織起來(lái)的一種形式。 這些有序排列的同類(lèi)數(shù)據(jù)元素的集合稱(chēng)為數(shù)組。
數(shù)組是用于儲(chǔ)存多個(gè)相同類(lèi)型數(shù)據(jù)的集合。
在C語(yǔ)言中, 數(shù)組屬于構(gòu)造數(shù)據(jù)類(lèi)型。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是拍纖基本數(shù)據(jù)類(lèi)型或是構(gòu)造類(lèi)型。因此按數(shù)組元素的類(lèi)型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等脊沖各種類(lèi)別。
函數(shù)在編程中的作用:
支持閉包和高階函數(shù),支持惰性計(jì)算(lazy evaluation)。使用遞歸作為控制流程的機(jī)制。加強(qiáng)了引用透明性。沒(méi)有副作用。我將重點(diǎn)放在在 Java 語(yǔ)言中使用閉包和高階函數(shù)上,但是首先對(duì)上面列出的所有特點(diǎn)做一個(gè)概述。
閉包和高階函數(shù)
函數(shù)編程支持函數(shù)作為第一類(lèi)對(duì)象,有時(shí)稱(chēng)為 閉包或者 仿函數(shù)(functor)對(duì)象。實(shí)質(zhì)上,閉包是起函數(shù)的作用并可以像對(duì)象一樣操作的對(duì)象。與此類(lèi)似,F(xiàn)P 語(yǔ)言支持 高階函數(shù)。高階函數(shù)可以用另一個(gè)函數(shù)(間接地,用一個(gè)表達(dá)式) 作為其輸入?yún)?shù),在某些情況下,它甚至返回一個(gè)函數(shù)作為其輸出參數(shù)。這兩種結(jié)構(gòu)結(jié)合在仔棗一起使得可以用優(yōu)雅的方式進(jìn)行模塊化編程,這是使用 FP 的最大好處。
惰性計(jì)算
除了高階函數(shù)和仿函數(shù)(或閉包)的概念,F(xiàn)P 還引入了惰性計(jì)算的概念。在惰性計(jì)算中,表達(dá)式不是在綁定到變量時(shí)立即計(jì)算,而是在求值程序需要產(chǎn)生表達(dá)式的值時(shí)進(jìn)行計(jì)算。延遲的計(jì)算使您可以編寫(xiě)可能潛在地生成無(wú)窮輸出的函數(shù)。因?yàn)椴粫?huì)計(jì)算多于程序的其余部分所需要的值,所以不需要擔(dān)心由無(wú)窮計(jì)算所導(dǎo)致的 out-of-memory 錯(cuò)誤。一個(gè)惰性計(jì)算的例子是生成無(wú)窮 Fibonacci 列表的函數(shù),但是對(duì) 第 n 個(gè)Fibonacci 數(shù)的計(jì)算相當(dāng)于只是從可能的無(wú)窮列表中提取一項(xiàng)。
遞歸
FP 還有一個(gè)特點(diǎn)是用遞歸做為控制流程的機(jī)制。例如,Lisp 處理的列表定義為在頭元素后面有子列表,這種表示法使得它自己自然地對(duì)更小的子列表不斷遞歸。
函數(shù)的優(yōu)點(diǎn):
1.代碼簡(jiǎn)潔,開(kāi)發(fā)快速
函數(shù)式編程大量使用函數(shù),減少了代碼的重復(fù),因此程序比較短,開(kāi)發(fā)速度較快。
Paul Graham在《黑客與畫(huà)家》一書(shū)中寫(xiě)道:同樣功能的程序,極端情況下,Lisp代碼的長(zhǎng)度可能是C代碼的二十分之一。
如果程序員每天所寫(xiě)的代碼行數(shù)基本相同,這就意味著,"C語(yǔ)言需要一年時(shí)間完成開(kāi)發(fā)某個(gè)功能,Lisp語(yǔ)言只需要不到三星期。反過(guò)來(lái)說(shuō),如果某個(gè)新功能,Lisp語(yǔ)言完成開(kāi)發(fā)需要三個(gè)月,C語(yǔ)言需要寫(xiě)五年。"當(dāng)然,這樣的對(duì)比故意夸大了差異,但是"在一個(gè)高度競(jìng)爭(zhēng)的市場(chǎng)中,即使開(kāi)發(fā)速度只相差兩三倍,也足以使得你永遠(yuǎn)處老戚哪在落后的位置。"
2. 接近自然語(yǔ)言,易于理解
函數(shù)式編程的自由度很高,可以寫(xiě)出很接近自然語(yǔ)言的代碼。
前文曾經(jīng)將表達(dá)式(1 + 2) * 3 - 4,寫(xiě)成函數(shù)式語(yǔ)言:
subtract(multiply(add(1,2), 3), 4)
對(duì)它進(jìn)行變形,不難得到另一種寫(xiě)法:
add(1,2).multiply(3).subtract(4)
這基本就是自然語(yǔ)言的表達(dá)了。再看下面的代碼,大家應(yīng)該一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函數(shù)式編程的代碼更容易理解。
3. 更方便的代碼管理
函數(shù)式編程不依賴(lài)、也不會(huì)改變外界的狀態(tài),只要給定輸入?yún)?shù),返回的結(jié)果必定相同。因此,每一個(gè)函數(shù)都可以被看做獨(dú)立單元,很有利于進(jìn)行單元測(cè)試(unit testing)和除錯(cuò)(debugging),以及模塊化組合。
4. 易于"并發(fā)編程"
函數(shù)式編程不需要考慮"死鎖"(deadlock),因?yàn)樗恍薷淖兞浚愿静淮嬖?鎖"線程的問(wèn)題。不必?fù)?dān)心一個(gè)線程的數(shù)據(jù),被另一個(gè)線程修改,所侍碼以可以很放心地把工作分?jǐn)偟蕉鄠€(gè)線程,部署"并發(fā)編程"(concurrency)。
請(qǐng)看下面的代碼:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
由于s1和s2互不干擾,不會(huì)修改變量,誰(shuí)先執(zhí)行是無(wú)所謂的,所以可以放心地增加線程,把它們分配在兩個(gè)線程上完成。其他類(lèi)型的語(yǔ)言就做不到這一點(diǎn),因?yàn)閟1可能會(huì)修改系統(tǒng)狀態(tài),而s2可能會(huì)用到這些狀態(tài),所以必須保證s2在s1之后運(yùn)行,自然也就不能部署到其他線程上了。
多核CPU是將來(lái)的潮流,所以函數(shù)式編程的這個(gè)特性非常重要。
5. 代碼的熱升級(jí)
函數(shù)式編程沒(méi)有副作用,只要保證接口不變,內(nèi)部實(shí)現(xiàn)是外部無(wú)關(guān)的。所以,可以在運(yùn)行狀態(tài)下直接升級(jí)代碼,不需要重啟,也不需要停機(jī)。Erlang語(yǔ)言早就證明了這一點(diǎn),它是瑞典愛(ài)立信公司為了管理電話系統(tǒng)而開(kāi)發(fā)的,電話系統(tǒng)的升級(jí)當(dāng)然是不能停機(jī)的。