【问题标题】:Is it the optimal way of using std::sort()?它是使用 std::sort() 的最佳方式吗?
【发布时间】:2020-03-09 18:03:24
【问题描述】:

我有一个包含 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::sort(v.begin(), v.end(), std::greater) 可以吗?
  • 我希望“a”排在第一位,但我在问题中犯了一个错误,对不起
  • 这些词会永远是这 5 个词之一吗?如果不是,则需要更准确地解释排序规则。
  • 是的,就是初始化列表中的单词
  • 您也可以使用多个 stl algorithms,例如 partition + sortsort + rotate。虽然这样做可能有点矫枉过正。

标签: c++


【解决方案1】:

这就足够了:

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

【讨论】:

  • 谢谢。如果我想要订单:zawodowe, a, wyzsze, podstawowe, bez wyksztalcenia 还有比这更简单的方法吗? std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b){ if(a == "a" && b == "bez wyksztalcenia ") 返回真; if(a == "a" && b == "podstawowe") 返回真; if(a == "a" && b == "wyzsze") 返回真;返回 a>b;跨度>
  • 是的,看托比的回答
【解决方案2】:

Alan's answer 在单词集几乎按字母顺序排列时起作用,其中一个值移动到序列的末尾。对于更通用的方法,我们需要从单词到按我们想要的顺序排序的东西的映射。小整数是显而易见的选择:

#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
  • 在使用&lt;iostream&gt;&lt;string&gt; 之前,请务必包含它们。
  • 通过 const 引用而不是按值传递字符串。
  • 使用 for 进行迭代时使用 const 引用。
  • 当不需要隐含刷新时,首选'\n' 而不是std::endl

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2019-02-11
    • 1970-01-01
    • 2010-10-11
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多