排序时最后应出现以“<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>

感谢您的帮助。

  1. 将包含 <cr> 的字符串移到另一个容器中。
  2. 对剩余的字符串进行排序。
  3. 对包含 <cr>
  4. 的字符串的容器进行排序
  5. 在第一个列表的末尾添加第二个容器项目

此外,您可以将包含 <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>