[英]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:我顺便解决的其他事情:
using namespace std
.using namespace std
。<iostream>
and <string>
before using them.<iostream>
和<string>
。for
.for
。'\\n'
to std::endl
when there's no need for the implied flush.'\\n'
到std::endl
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.