我试图制作一个用这个标准对字符串向量进行排序的函数:
所有字符串=" NULL"必须到向量的末尾并从那里减少。其余的字符串必须保持秩序。
例如:
{"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"}
输出应为:
{"Potato","Charmander","Spaghetti","NULL","NULL","NULL"}
我试过这个,但它不太有效:
bool comp(string i, string j){
if(i=="NULL"){return i>j;}
if (j=="NULL") {return i<j;}
提前致谢
答案 0 :(得分:1)
你可以做以下两件事之一:
标准库有"partition" algorithm,它会将符合特定条件的所有元素移动到字符串的末尾。
std::vector<string> vec {
"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
};
auto comparator =
[](const std::string& lhs, const std::string& rhs)
{
return rhs == "NULL" or lhs <= rhs;
};
std::sort(vec.begin(), vec.end(), comparator);
comp()
请注意此处的比较与您的comp()
功能之间的差异。比较器回答问题&#34;如果第一个字符串我来到第二个字符串之前?&#34; - 而您的{{1}}函数根本没有给出符合您要求的答案。
答案 1 :(得分:1)
您可以使用分区算法:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
vector<string> vec {
"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
};
partition(begin(vec), end(vec), // Partition the values
[](const string& s) { return s != "NULL"; });
copy(begin(vec), end(vec), ostream_iterator<string>{cout, " "});
cout << endl;
return 0;
}
// RESULT: Potato Spaghetti Charmander NULL NULL NULL
注意:如果您需要维护相对顺序,请使用stable_partition。
答案 2 :(得分:0)
您可以编写自己的函数版本,将一些字符串放在最后:
namespace myAlgo {
template<typename ForwardIter, class T >
ForwardIter moveToEnd(ForwardIter first, ForwardIter last, const T& value) {
if (first == last) {
return first;
}
ForwardIter fasterFirst = first;
//Shift strings that do not match value to the left in stable manner
while (++fasterFirst != last) {
if (*fasterFirst != value) {
*++first = *fasterFirst;
}
}
ForwardIter pivot = first;
//Fill rest with value
while (first != last) {
*++first = value;
}
return pivot;
}
}
然后只是:
myAlgo::moveToEnd(vec.begin(), vec.end(), "NULL");