1. 程式人生 > >C++:標準庫函式(sort、rand等)

C++:標準庫函式(sort、rand等)

STL標準庫裡有許多諸如排序、生成隨機數的函式,使用前包含標頭檔案

 #include <algorithm>

排序:sort

這個函式可以傳兩個引數或三個引數。第一個引數是要排序的區間首地址,第二個引數是區間尾地址的下一地址。也就是說,排序的區間是[a,b)。簡單來說,有一個數組int a[100],要對從a[0]到a[99]的元素進行排序,只要寫sort(a,a+100)就行了,預設的排序方式是升序。
對vector物件排序:

sort(s.begin(),s.end());
  • 排序的資料型別不侷限於整數,只要是定義了<運算的型別都可以,比如字串類string。
  • 如果是沒有定義<運算的資料型別,或者想改變排序的順序,就要用到第三引數——比較函式。比較函式是一個自己定義的函式,返回值是bool型,它規定了什麼樣的關係才是“小於”。想把剛才的整數陣列按降序排列,可以先定義一個比較函式cmp
bool cmp(int a,int b)
{
//升序排列,如果改為return a>b,則為降序
    return a<b;
}

排序的時候就寫sort(a,a+100,cmp);

  • 標準庫的sort演算法實現,採用快排的思想,平均的時間複雜度是 N(logN);演算法中還提供了其他的集中排序函式 sort_heap() stable_sort()
    ,時間複雜度都在 N(logN)。

生成隨機數:rand、srand

rand函式的標頭檔案在<stdlib.h>中,如果你只要產生隨機數而不需要設定範圍的話,你只要用rand()就可以了:rand()會返回一隨機數值, 範圍在0至RAND_MAX 間。RAND_MAX定義在stdlib.h, 其值為2147483647。
如果想要生成某個範圍內的隨機數,可以

int r=rand()%n;

但rand函式生成的只是偽隨機數,要想生成真正的隨機數,還需要用srand函式進行初始化。
srand()用來設定rand()產生隨機數時的隨機數種子。引數seed必須是個整數,如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

使用當前時鐘作為隨機數種子

srand( (int)time(0) );
int r=rand()%n;

全排列函式 next_permutation

next_permutation()是按照字典序產生排列的,並且是從陣列中當前的字典序開始依次增大直至到最大字典序。

基本的使用模板是:

int a[];
do{

}while(next_permutation(a,a+n));

下面的程式碼可產生1~n的全排列。

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        int a[1000];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);//可以自行測試一下刪除後的結果
        do{
            for(int i=0;i<n;i++)
                printf("%d ",a[i]);
            printf("\n");
        }while(next_permutation(a,a+n));
    }
    return 0;
}

例如輸入

3

1 0 2

如果有sort()

輸出為

0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

相關推薦

C++標準函式sortrand

STL標準庫裡有許多諸如排序、生成隨機數的函式,使用前包含標頭檔案 #include <algorithm> 排序:sort 這個函式可以傳兩個引數或三個引數。第一個引數是要排序的區間首地址,第二個引數是區間尾地址的下一地址。也就是說

C語言預定義巨集__LINE____DATE__淺析

ANSIC標準定義了以下5種可供C語言使用的預定義巨集: __LINE__ 在原始碼中插入當前原始碼行號 __FILE__ 在原始碼中插入當前原始碼檔名 __DATE__ 在原始碼中插入當前編譯日期〔注意和當前系統日期區別開來〕 __TIME__ 在原始碼中插入當前編譯時間

整理網上資料---C標準值篇二 標準原始碼下載地址標準手冊下載地址

C標準庫原始碼及手冊.zip,包括: http://download.csdn.net/detail/yangzhao0001/9057823 C標準庫函式集(標頭檔案索引)------手冊-AH.p

C語言常用函式含詳細用法

一、數學函式 呼叫數學函式時,要求在原始檔中包下以下命令列: #include <math.h> 函式原型說明 功能 返回值 說明 int abs( int x) 求整數x的絕對值 計算結果 double fabs(double

c++ 準標準學習 -- 持續更新

環境搭建---網上查詢 本人測試環境Ubuntu16.04 #include <iostream> #include <boost/version.hpp> #include <boost/config.hpp> using n

嵌入式Linux開發常用C語言標準函式

推薦兩個網站: http://www.cplusplus.com/ 各大語言基礎入門必備網站 菜鳥教程:http://www.runoob.com/ 標準輸入/輸出類函式 scanf() http://www.runoob.com/cprogramming/c-functio

ANSI C(C89)標準函式手冊

前言 ANSI C(C89)標準庫函式共有15個頭檔案。這15個頭檔案分別為: 1.<assert.h>           2.<ctype.h>         3.<errno.h> 4.<float.h>       

C++ STL標準函式

參考連結 0 前言: 平時STL自己用的很少,很多庫函式都不是很熟悉,趁著最近有空,將STL的知識學習一下。主要學習一下,pair,vector,set,vector,stack,queue,map,string. 1 pair 位於標頭檔案&l

notepad++ 查找引用(Find Reference)適用於c c++及各類腳本比如luapython

onf 後綴名 ces ram 找不到 進行 align ins studio 在程序開發過程中,程序員經常用到的一個功能就是查找引用(Find Reference),Visual Studio裏面的對應功能是“查找所有引用”(Find All Re

記錄開發Nodejs c++ addon的一些經驗技術棧

c++編寫 fstream href ren http lan www. 記錄 ref Nodejs c++ addon 是用c++去編寫Nodejs的插件 技術棧: 1、node-gyp   一個用於把c++文件編譯成node可執行文件的庫 2、v8   google

Python 標準一覽Python進階學習

日誌配置 -html 令行 鼓勵 python.h 垃圾 eap form types 轉自:http://blog.csdn.net/jurbo/article/details/52334345 寫這個的起因是,還是因為在做Python challenge的時候,

SDL2---編譯SDL測試播放簡單畫素資料YUVRGB

本篇博文整理自雷神(雷霄驊https://blog.csdn.net/leixiaohua1020/article/list/3)多篇博文,多謝分享,在此致敬! SDL簡介: SDL庫的作用說白了就是封裝了複雜的視音訊底層操作,簡化了視音訊處理的難度。 以下轉自WiKi:

css樣式文字led效果走馬燈輪播

<marquee>標籤,它是成對出現的標籤,首標籤<marquee>和尾標籤</marquee>之間的內容就是滾動內容。<marquee>標籤的屬性主要有behavior、bgcolor、direction、width、height、hspace、vspace、

利用libjpeg-turbo壓縮影象RGBYUV為jpg

簡介 libjpeg-turbo是libjpeg的升級版,它 的價值是利用SIMD指令集,加速了編解碼過程。官網上的介紹中提到某個案例中從原來的0.3左右降低到0.1,時間只有原來的1/3,在我的工

c語言clock()計時函式結果很精準

#include<stdio.h> #include<time.h> clock_t start, stop; //clock_t為clock()函式返回的變數型別 double duration; int main() { start=clock();

圖 | 兩種遍歷方式深度優先搜尋DFS深搜和廣度優先搜尋BFS廣搜

前邊介紹了有關圖的 4 種儲存方式,本節介紹如何對儲存的圖中的頂點進行遍歷。常用的遍歷方式有兩種:深度優先搜尋和廣度優先搜尋。 深度優先搜尋(簡稱“深搜”或DFS) 圖 1 無向圖 深度優先搜尋的過程類似於樹的先序遍歷,首先從例

C語言的fopen函式檔案操作/讀寫

標頭檔案:#include <stdio.h> fopen()是一個常用的函式,用來以指定的方式開啟檔案,其原型為:     FILE * fopen(const char * path, const char * mode); 【引數】path為包含了路徑的

C++中常用小函式刷演算法題必備

int a = 123; string str1 = to_string(a);////將整數轉化為string型別 string str = "abcdefg"; //str.substr(1

FFmpeg原始碼簡單分析記憶體的分配和釋放av_malloc()av_free()

=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================

機器學習回顧篇7決策樹演算法ID3C4.5

  注:本系列所有部落格將持續更新併發布在github上,您可以通過github下載本系列所有文章筆記檔案。   1 演算法概述¶