簡體   English   中英

這是使用 std::sort() 的最佳方式嗎?

[英]Is it the optimal way of using std::sort()?

我有一個包含 5 個單詞的向量,多次使用,我想要的是實現這個單詞順序:“a,zawodowe,wyzsze,podstawowe,bez wyksztalcenia”所以我寫了這段代碼,我想知道它是否是最佳方式使用排序,或者可以跳過 if 條件之一

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;


int main()
{
   std::vector<std::string> v = {"wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia", "a" };

//return a>b daje:    zawodowe, wyzsze, podstawowe, bez wyksztalcenia, a
    std::sort(v.begin(), v.end(), [](std::string a, std::string b){
        if(a == "zawodowe" && b == "a") return false;
        if(a == "a" && b == "zawodowe") return true;
        if(a == "wyzsze" && b == "a") return false;
        if(a == "podstawowe" && b == "a") return false;
        if(a == "bez wyksztalcenia" && b == "a") return false;
        return a>b;

    });

    for (std::string i: v) {
        std::cout << i << std::endl;
    }
}

這應該足夠了:

[](std::string a, std::string b){
        if(b == "a") return false;
        if(a == "a") return true;
        return a>b;
}

當一組單詞幾乎按字母順序排列時,艾倫的答案有效,其中一個值移動到序列的末尾。 對於更通用的方法,我們需要從單詞到按我們想要的順序排序的東西的映射。 小整數是顯而易見的選擇:

#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> v = {"wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia",
                                  "wyzsze", "podstawowe", "zawodowe","podstawowe",
                                  "zawodowe", "bez wyksztalcenia", "zawodowe", "zawodowe", "wyzsze",
                                  "zawodowe", "zawodowe", "wyzsze", "podstawowe", "bez wyksztalcenia", "a" };


    auto const by_weight = [](std::string& a, std::string& b)
                           {
                               static const std::map<std::string, int> weight
                                   = {{"a", 1},
                                      {"zawodowe", 2},
                                      {"wyzsze", 3},
                                      {"podstawowe", 4},
                                      {"bez wyksztalcenia", 5}};
                               return weight.at(a) < weight.at(b);
                           };
    std::sort(v.begin(), v.end(), by_weight);

    for (auto const& i: v) {
        std::cout << i << '\n';
    }
}

我順便解決的其他事情:

  • 不要using namespace std
  • 在使用它們之前,請務必包含<iostream><string>
  • 通過常量引用傳遞字符串,而不是通過值。
  • 迭代時使用 const 引用for
  • 當不需要隱含刷新時,更喜歡'\\n'std::endl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM