1. 程式人生 > >【用法學習】C++ pair用法及使用sort函式對pair資料進行排序

【用法學習】C++ pair用法及使用sort函式對pair資料進行排序

 pair 預設對first升序,當first相同時對second升序;

類模板:template <class T1, class T2> struct pair

引數:T1是第一個值的資料型別,T2是第二個值的資料型別。

功能:pair將一對值組合成一個值,這一對值可以具有不同的資料型別(T1和T2),兩個值可以分別用pair的兩個公有函式first和second訪問。

具體用法:

1.定義(構造):

     pair<int, double> p1;  //使用預設建構函式
     pair<int, double> p2(1, 2.4);  //用給定值初始化
     pair<int, double> p3(p2);  //拷貝建構函式

2.訪問兩個元素(通過firstsecond):

     pair<int, double> p1;  //使用預設建構函式
     p1.first = 1;
     p1.second = 2.5;
     cout << p1.first << ' ' << p1.second << endl;

輸出結果:1 2.5

3.賦值operator = :

(1)利用make_pair

     pair<int, double> p1;
     p1 = make_pair(1, 1.2);

(2)變數間賦值:

    pair<int, double> p1(1, 1.2);
    pair<int, double> p2 = p1;

可以用cmp陣列改;

程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
pair<int,int>pa[100];
int cmp(pair<int,int>a,pair<int,int>b){
    if(a.first!=b.first)return a.first>b.first;
    else return a.second<b.second;
}
int main(){
    int a,b;
    for(int i=0;i<5;i++)scanf("%d%d",&a,&b),pa[i]=make_pair(a,b);
    sort(pa,pa+5,cmp);
    for(int i=0;i<5;i++)printf("%d %d\n",pa[i].first,pa[i].second);
    return 0;
}

最近在寫一個演算法的時候,把一些資料存在了pair中,並且需要根據pair中first或者second的值對這些資料進行排序。比如:輸入資料(1,2)、(4,2)、(3,3)、(2,1)根據first的值大小進行升序排序,輸出(1,2)、(2,1)、(3,3)、(4,2)。
經過思索之後得到的實現方法如下:
首先將這些資料存在vector陣列中,vector<pair<int,int>>vec;
然後使用sort函式對陣列進行排序,這裡就涉及到了sort函式的使用了。
下面是sort函式使用方法
函式宣告:

template <class RandomAccessIterator>
  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );

template <class RandomAccessIterator, class Compare>
  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
                     Compare comp );
引數解釋:
(1)第一個是要排序的陣列的起始地址。
(2)第二個是結束的地址(最後一位要排序的地址的下一地址)。
(3)第三個引數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個引數,此時預設的排序方法是從小到大排序。
我們可以根據自己的需求自定義第三個引數cmp函式,比如若要對整型陣列降序排序,則可以這樣來寫cmp函式:
bool cmp(int a, int b)
{
    return a>b;//升序則為a<b
}

這個cmp引數使用起來非常方便,因為它正好能解決我們的pair排序問題。
我們只要根據陣列中的元素型別定義cmp函式的引數,並且根據需求定義函式體

bool cmp(pair<int, int>a, pair<int, int>b)
{
    return a.first<b.first;//根據fisrt的值升序排序
    //return a.second<b.second;//根據second的值升序排序
}

然後呼叫sort函式sort(vec.begin(),vec.end(),cmp)。
便可以根據pair中first的值進行升序排序。

下面是具體程式碼實現

#include "stdafx.h"
#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;

//根據first的值升序排序
bool cmp1(pair<int,int>a,pair<int,int>b)
{
    return a.first < b.first;
}

//根據second的值升序排序
bool cmp2(pair<int, int>a, pair<int, int>b)
{
    return a.second < b.second;
}
int main()
{
    vector<pair<int, int>>vec;
    vec.push_back({ 1,2 });
    vec.push_back({ 4,2 });
    vec.push_back({ 3,3 });
    vec.push_back({ 2,1 });
    sort(vec.begin(), vec.end(), cmp1);
    cout << "根據first的值升序排序:" << endl;
    for (auto it = vec.begin();it != vec.end();it++)
    {
        cout << "(" << it->first << "," << it->second << ")" << endl;
    }
    sort(vec.begin(), vec.end(), cmp2);
    cout << "根據second的值升序排序:" << endl;
    for (auto it = vec.begin();it != vec.end();it++)
    {
        cout << "(" << it->first << "," << it->second << ")" << endl;
    }
}

執行截圖

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下內容為原創:

自己又寫了幾個測試的小例子,加深理解。

test case1

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=200000+10;
pair<int,int>a[nmax];
int main(int argc, char** argv) {
	int t;
	while(cin>>t){
		int n;//任務數 
		int m;//人數 
		while(t--){
			cin>>n>>m;
			for(int i=0;i<n;i++){
				cin>>a[i].first>>a[i].second;
			} 
			sort(a,a+n);//按照first左邊排序 
			for(int i=0;i<n;i++){
				cout<<a[i].first<<" "<<a[i].second<<endl;
			}
		}
	}
	return 0;
}/*
1
4 3
3 1
2 4
1 6
4 7
------
1 6
2 4
3 1
4 7

*/ 

test case2

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=200000+10;
pair<int,int>a[nmax];
int main(int argc, char** argv) {
	int t;
	while(cin>>t){
		int n;//任務數 
		int m;//人數 
		while(t--){
			cin>>n>>m;
			for(int i=0;i<n;i++){
				cin>>a[i].second>>a[i].first;
			} 
			sort(a,a+n);//按照firs右排序 
			for(int i=0;i<n;i++){
				cout<<a[i].second<<" "<<a[i].first<<endl;
			}
		}
	}
	return 0;
}/*
1
4 3
3 1
2 4
1 6
4 7
-----
3 1
2 4
1 6
4 7

*/ 

相關推薦

用法學習C++ pair用法使用sort函式pair資料進行排序

 pair 預設對first升序,當first相同時對second升序; 類模板:template <class T1, class T2> struct pair 引數:T1是第一個值的資料型別,T2是第二個值的資料型別。 功能:pair將一對值組

機器學習Apriori演算法——原理程式碼實現(Python版)

Apriopri演算法 Apriori演算法在資料探勘中應用較為廣泛,常用來挖掘屬性與結果之間的相關程度。對於這種尋找資料內部關聯關係的做法,我們稱之為:關聯分析或者關聯規則學習。而Apriori演算法就是其中非常著名的演算法之一。關聯分析,主要是通過演算法在大規模資料集中尋找頻繁項集和關聯規則。

Redis學習Redis入門安裝使用

第一份工作的時候就聽著老大說要使用Redis,當時一臉懵逼,到底什麼是Redis呢,Redis又有什麼作用的。不過還沒來得及向老大學習的時候,公司找了些理由就把所有的員工都給開了。趁著這段找工作的時間,正好可以來好好研究一下Redis了。廢話不多說,開始!

深度學習Alexnet網路分析程式碼實現

簡介 Alexnet是2012年ImageNet比賽的冠軍Hinton及其學生Alex Krizhevsky提出,並以其姓名命名的網路。Alexnet的提出也正式掀起了深度學習的熱潮,激發了研究者對深度學習的熱情。雖然後面出現了更為優秀的VGGNet、GooLeNet、Re

機器學習C++與OpenCV、Tensorflow-python聯合呼叫

  上一篇我介紹了C++呼叫Python的入門方法。這一篇我講述C++與OpenCV、Tensorflow-python聯合呼叫的一次成功的實驗過程。   C++通過python呼叫tensorflow,比呼叫C++版本的tensorflow的優勢在於:ten

機器學習梯度下降演算法梯度優化演算法

用於評估機器學習模型的就是損失函式,我們訓練的目的基本上都是最小化損失,這個最小化的方式就要用優化演算法了,機器學習中最常用的就是梯度下降演算法。 導數、方向導數和梯度 要了解梯度下降演算法是什麼首要知道梯度是什麼,導數和方向導數又是瞭解梯度的前提。

IOS學習CocoaPods安裝使用配置私有庫

如何安裝? 1.安裝ruby環境,新增淘寶ruby映象 $ gem sources --remove https://rubygems.org/ //等有反應之後再敲入以下命令 $ gem sources -a http://ruby.taobao.org/ 2

機器學習先驗概率、似然函式、後驗概率、對數似然函式等概念的理解

1)先驗:統計歷史上的經驗而知當下發生的概率; 2)後驗:當下由因及果的概率; 2、網上有個例子說的透徹: 1)先驗——根據若干年的統計(經驗)或者氣候(常識),某地方下雨的概率; 2)似然——看到了某種結果,對產生結果的原因作出假設:是颳風了?還是有烏雲?還是

unix學習檔案處理2—檔案sort、cut命令

檔案sort、cut命令 檔案排序-sort sort Ordering a set of items according to some criteria options b Ignore leading blanks f

機器學習tensorflow: GPU求解帶核函式的SVM二分類支援向量機

SVM本身是一個最優化問題,因此理所當然可以用簡單的最優化方法來求解,比如SGD。2007年pegasos就發表了一篇文章講述簡單的求解SVM最優化的問題。其求解形式簡單,但是並沒有解決核函式計算量巨大的問題。這裡給出了一個tensorflow的帶核函式的SVM

Angular4學習--路由傳參二 (在URL中傳遞資料)

前言: 上一篇文章已經介紹瞭如何路由傳遞引數的第一種方法:在查詢引數中傳遞引數,這篇文章來分享路由傳遞引數的第二種方式,在URL中傳遞引數。 第一步: 1.修改app-routing.modu

python學習今天看看學習 %d ,%s, %f 等用法,下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算

msg ear end style 資料 科學 一個 保留 value 今天看看學習 %d ,%s, %f 等用法。%d 是占位符整數,%s 是占位符,%f 是浮點數。下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算。重點在於用占位符來print

Mint-UIAction sheet 用法詳解(內含取消事件的觸發方法)

鑑於mint-ui官方文件的極簡描述和對功能介紹的點到為止,許多功能的完全實現是需要通過閱讀原始碼才可以知道其真正的用法。 今天給大家介紹一下Action sheet的用法,以及我踩過的坑,感覺比較有意義,希望能幫到各位。 效果圖: 首先我先帶大家看一下官方的介紹: act

機器學習視覺化Matplotlib的scatter函式用法

本文出處:http://blog.csdn.net/u013634684/article/details/49646311 最近開始學習Python程式設計,遇到scatter函式,感覺裡面的引數不知道什麼意思於是查資料,最後總結如下: 1、scatter函式原型 2、

演算法學習AVL平衡二叉搜尋樹原理各項操作程式設計實現(C++)

AVLTree即(Adelson-Velskii-Landis Tree),是加了額外條件的二叉搜尋樹。其平衡條件的建立是為了確保整棵樹的深度為O(nLogn)。平衡條件是任何節點的左右子樹的高度相差不超過1. 在下面的程式碼中,程式設計實現了AVL樹的建立、查詢、插入、

js學習addEventListener() 用法

addEventListener() 方法用於向指定元素新增事件控制代碼。 addEventListener() 方法新增的事件控制代碼不會覆蓋已存在的事件控制代碼。 你可以向一個元素新增多個事件控制代碼。 你可以向同個元素新增多個同類型的事件控制代碼,如:兩個

JAVA學習Java中迭代器Iterator遍歷的兩種用法

迭代器的三個方法 2. 使用hasNext()檢查序列中是否還有元素,有則返回true。 3.使用remove()將迭代器新返回的元素刪除。 兩種迴圈方法: //使用for迴圈迭代 for (Iterator iter = l.iterator(); iter.h

keras學習——Flatten層的用法

        flatten層用來扁平引數用,一般用在卷積層與全連結層之間,可以從vgg16網路中可以看出,但是在後來的網路中用GlobalAveragePooling2D代替了flatten層,可以

Vue.js學習生命周期數據綁定

cli per number 變量命名 num ber 數據 bin otto 一、生命後期  官網的圖片說明: Vue的生命周期總結 var app = new Vue({   el:"#app",   beforeCreate: functi

jquery基礎 jquery.manifest用法:通過後臺查詢and添加到默認項

item ID UNC 技術分享 img bsp random func div 今天做一個東西 效果如下: 後臺已經保存了006這個SN碼,現在需要查到了這個人(楊小婷),然後作為默認值,展示到 manifest 裏面 <script>