简体   繁体   English

这是使用 std::sort() 的最佳方式吗?

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

I have a vector with 5 words in it used multiple times, what i want is to achieve this order of words: "a, zawodowe, wyzsze, podstawowe, bez wyksztalcenia" So i wrote this code, and i wonder if its the optimal way of using sort, or maybe one of the if conditions can be skipped我有一个包含 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;
    }
}

This should be sufficient:这应该足够了:

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

Alan's answer works when the set of words is almost alphabetical, with one value moved to an end of the sequence.当一组单词几乎按字母顺序排列时,艾伦的答案有效,其中一个值移动到序列的末尾。 For a more general approach, we need a mapping from the words to something that sorts in the order we want.对于更通用的方法,我们需要从单词到按我们想要的顺序排序的东西的映射。 Small integers are the obvious choice:小整数是显而易见的选择:

#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';
    }
}

Other things I fixed in passing:我顺便解决的其他事情:

  • Don't using namespace std .不要using namespace std
  • Do include <iostream> and <string> before using them.在使用它们之前,请务必包含<iostream><string>
  • Pass strings by const reference, rather than by value.通过常量引用传递字符串,而不是通过值。
  • Use const reference when iterating using for .迭代时使用 const 引用for
  • Prefer '\\n' to std::endl when there's no need for the implied flush.当不需要隐含刷新时,更喜欢'\\n'std::endl

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM