C ++ソート関数をSwiftに変換する方法は?

user6298177

C ++コーディングをSwiftコーディングに変換しました。しかし、私はこの機能を正確に理解することはできませんsort(v.begin(), v.end());しかし、私はそれから私が理解したことを書きました。

問題は、迅速なコードがC ++コードとは異なる出力を提供することです。##見出し##

C ++

#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <array>

using namespace std;
typedef long long ll;

ll solve(ll N,ll K,vector<ll > &token){

    ll ans=0;

    vector< pair<ll, int> > v;

    for(int i = 0; i < N; i++)

        v.push_back( make_pair(token[i], N - i));

    sort(v.begin(), v.end());

    for(int i = 0;  i < N; i++){
        if( K >= v[i].second * v[i].first){
            K -=  v[i].second * v[i].first;
            ans += v[i].second;
        }
        else{
            ans += K / v[i].first;
            K = 0;
        }
    }
    return ans;
}

int main(){
    ll N = 57;
    ll K = 877914575;

    static const int arr[] = {436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965};

    vector<ll> token (arr, arr + sizeof(arr) / sizeof(arr[0]) );
    cout<<solve(N,K,token);
}

Swiftコード(変換しようとしました):

import Foundation

typealias ll = Int64

func solve(_ N:ll, K:ll, token:inout [ll])->ll{

    var ans:ll = 0
    var K = K
    var v = [(first:ll,second:ll)]()

    for i in 0..<N{

        v.append((token[Int(i)],N-i))
    }
    v = v.sorted(by: { (element1, element2) -> Bool in

        return element1.first > element2.first
    })

    for i in 0..<N{

        if(K >= ll(v[Int(i)].second) * v[Int(i)].first){

            K -= ll(v[Int(i)].second) * v[Int(i)].first
            ans += ll(v[Int(i)].second)
        }else{
            ans += K/v[Int(i)].first
            K = 0
        }
    }
    return ans
}

func main(){

    let N:ll = 57;
    let K:ll = 877914575;
    var token:[ll] = [436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965]
    print(solve(N, K: K, token: &token))

}

main()

上記のコードに関して、C ++はに出力を提供し1637、Swiftはを提供し1438ます。しかし、Sortingそれらがなければ同じ数を与えます1612

の値の並べ替えが間違っていると思いましたvしかし、以下のSwiftコードがC ++ソートと同等かどうかはわかりません。

上記のコードでの並べ替え:

C ++:

sort(v.begin(), v.end());

迅速

v = v.sorted(by: { (element1, element2) -> Bool in

    return element1.first > element2.first
})

なぜそれらのプログラムは異なる価値を与えるのですか?どうすればそれを解決できますか?

更新:

入力:

let N:ll = 57;
let K:ll = 877914575;
var token:[ll] = [436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965]

期待される結果:

1637
羊飼いデビッド

この記事ではsort、C ++のペアのベクトルに対してデフォルトの実装がどのように機能するかを説明します。これは、最初の要素に基づいてベクトルを昇順で並べ替えるだけです。

Swiftコードは逆のことを行い、降順でソートします。に変更return element1.first > element2.firstするだけreturn element1.first < element2.firstで、元気になるはずです。

ところで、言語間でコードを単語ごとに変換するだけではいけません。C ++コードではなくアルゴリズムを変換します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Objective-CアプリデリゲートをSwiftに変換する方法は?

分類Dev

c / c ++コールバック関数をdelphiに変換する方法

分類Dev

C ++ sscanf_s()関数をC#に変換する方法

分類Dev

c関数のバイトを取得してcharに変換する方法

分類Dev

matlab関数をCに変換する

分類Dev

C ++暗黙の変換なしで関数をエミュレートする方法は?

分類Dev

拡張関数と追加関数を使用してSwiftメソッドをObjective-Cに変換します

分類Dev

Cで16進数を10進数に変換する方法は?

分類Dev

Javascriptリデュース関数をC#に変換する

分類Dev

このSwift構文をObjective-Cに変換する方法は?

分類Dev

Matlab / C関数をソースコードなしのバージョンに変換する

分類Dev

Obj-C init オーバーライド関数を Swift 3 に変換する

分類Dev

C#でソートされた辞書を関連するJavaScriptキー値ペア配列に変換する方法

分類Dev

Postgresql C uint64_tを数値に変換する方法は?

分類Dev

C ++-文字列を複数の整数に変換する方法は?

分類Dev

16進数を倍精度C#に変換する方法は?

分類Dev

C#関数をDelphi関数に変換する

分類Dev

C関数をPython関数に変換する

分類Dev

フロートをcの文字列に単純に変換する方法は?

分類Dev

C#関数をSwift4.2に変換します

分類Dev

このCコードをC ++に変換する方法は?

分類Dev

C#コードをC ++に変換する方法は?

分類Dev

ストリームをC#でbyte []に変換する方法は?

分類Dev

C ++で使用するためにC#dllメソッド/関数をエクスポートする方法

分類Dev

数式をCまたはJavaコードに変換する

分類Dev

SFML画像をC ++でOpenCVマットに変換する方法は?

分類Dev

JSON配列をC#リストに変換する方法は?

分類Dev

JSON配列をC#リストに変換する方法は?

分類Dev

C ++関数をC#に変換する(文字列の問題)

Related 関連記事

  1. 1

    Objective-CアプリデリゲートをSwiftに変換する方法は?

  2. 2

    c / c ++コールバック関数をdelphiに変換する方法

  3. 3

    C ++ sscanf_s()関数をC#に変換する方法

  4. 4

    c関数のバイトを取得してcharに変換する方法

  5. 5

    matlab関数をCに変換する

  6. 6

    C ++暗黙の変換なしで関数をエミュレートする方法は?

  7. 7

    拡張関数と追加関数を使用してSwiftメソッドをObjective-Cに変換します

  8. 8

    Cで16進数を10進数に変換する方法は?

  9. 9

    Javascriptリデュース関数をC#に変換する

  10. 10

    このSwift構文をObjective-Cに変換する方法は?

  11. 11

    Matlab / C関数をソースコードなしのバージョンに変換する

  12. 12

    Obj-C init オーバーライド関数を Swift 3 に変換する

  13. 13

    C#でソートされた辞書を関連するJavaScriptキー値ペア配列に変換する方法

  14. 14

    Postgresql C uint64_tを数値に変換する方法は?

  15. 15

    C ++-文字列を複数の整数に変換する方法は?

  16. 16

    16進数を倍精度C#に変換する方法は?

  17. 17

    C#関数をDelphi関数に変換する

  18. 18

    C関数をPython関数に変換する

  19. 19

    フロートをcの文字列に単純に変換する方法は?

  20. 20

    C#関数をSwift4.2に変換します

  21. 21

    このCコードをC ++に変換する方法は?

  22. 22

    C#コードをC ++に変換する方法は?

  23. 23

    ストリームをC#でbyte []に変換する方法は?

  24. 24

    C ++で使用するためにC#dllメソッド/関数をエクスポートする方法

  25. 25

    数式をCまたはJavaコードに変換する

  26. 26

    SFML画像をC ++でOpenCVマットに変換する方法は?

  27. 27

    JSON配列をC#リストに変換する方法は?

  28. 28

    JSON配列をC#リストに変換する方法は?

  29. 29

    C ++関数をC#に変換する(文字列の問題)

ホットタグ

アーカイブ