排序时最后应出现以“<cr>”开头的字符串
strings contarting '<cr>' should appear at last while sorting
我有以下一组字符串
'aa'
'hello'
'start'
'<1-10>'
'<cr>'
当我使用 C 中排序库中的 qsort 时,我得到以下输出
<1-10>
<cr>
aa
hello
start
但我想要以下输出
<1-10>
aa
hello
start
<cr>
感谢您的帮助。
- 将包含
<cr>
的字符串移到另一个容器中。 - 对剩余的字符串进行排序。
- 对包含
<cr>
的字符串的容器进行排序
- 在第一个列表的末尾添加第二个容器项目
此外,您可以将包含 <cr>
的字符串移动到列表末尾 (std::partition
) 并以不同方式在两个子数组上应用 qsort
,而不是使用单独的容器。
bool partitioner(string str) {
return str.find("<cr>") == string::npos;
}
现在:
vector<string> v {"hello", "world", "<cr>", "<cr>string"};
auto bound = partition(v.begin(), v.end(), partitioner);
sort(v.begin(), bound);
sort(bound, v.end());
我不确定您的实际设置,因为 vector
是 C++ 类型,而您声明要使用 C。
无论如何,也许下面为 std::vector 结合 std::sort 编写的代码显示了基本原理,您在其中引入了用于排序的自定义比较函数。请注意,qsort
也允许自定义比较函数,但语法会有所不同。
自定义比较函数的工作原理如下:如果两个字符串都以 <
开头,则比较它们的余数。如果其中一个以 <
开头,那么这个总是排在另一个之后。否则,它们只是简单地进行比较。我使用 char*
-数据类型来为你保持一些 C 的风格:-) :
int main() {
std::vector<const char*> s = {
"aa",
"start",
"hello",
"<d-10>",
"<cr>"
};
// sort using a custom function object
struct {
bool operator()(const char*a, const char*b)
{
if (*a == '<') {
if (*b == '<') {
return strcmp(a+1,b+1) < 0;
}
else {
return false;
}
}
else if (*b == '<') {
if (*a == '<') {
return strcmp(a+1,b+1) < 0;
}
else {
return true;
}
}
else
return strcmp(a,b) < 0;
}
} customLess;
std::sort(s.begin(), s.end(), customLess);
for (auto a : s) {
std::cout << a << std::endl;
}
return 0;
}
输出:
aa
hello
start
<cr>
<d-10>