是否可以根据复杂的标准使用 std::sort() 对字符串向量进行排序?

Is it possible to sort a vector of string with std::sort(), based on a complex criteria?

我需要对包含文件夹名称的 std::vector<std::wstring> 进行排序,以使父文件夹始终位于其所有子文件夹之后,例如:

C:\Main\App\QtGraphicalEffects\private
C:\Main\App\QtGraphicalEffects
C:\Main\App\Qt\labs\platform
C:\Main\App\Qt\labs
C:\Main\App\Qt
C:\Main\App
C:\Main\

为了达到这样的排序我可能会使用冒泡排序算法,如下所示:

void BubbleSortDirs(std::vector<std::wstring>& dirs)
{
    bool swapped = false;

    do
    {
        swapped = false;

        for (std::size_t i = 0; i < dirs.size() - 1; ++i)
            // swap positions if first dir is entirely contained in the second
            if (dirs[i] != dirs[i + 1] && dirs[i + 1].find(dirs[i]) == 0)
            {
                std::swap(dirs[i], dirs[i + 1]);
                swapped = true;
            }
    }
    while (swapped);
}

这段代码运行良好,但我觉得应该有更好的解决方案。所以我尝试使用std::sort函数来优化我的排序,至少提供一个更优雅的解决方案。

我尝试了以下实现:

bool SortDirs(const std::wstring& first, const std::wstring& second)
{
    // swap positions if first dir is entirely contained in the second
    return (first == second || first.find(second) == 0);
}

...

std::sort(dirs.begin(), dirs.end(), SortDirs);

我预计 std::sort() 会提供与 BubbleSortDirs() 函数相同的结果,但事实并非如此,结果在多个位置都失败了。在这一点上,我强烈怀疑 std::sort() 不适用于像我尝试应用的复杂排序标准。

所以我的问题是:

我终于这样解决了我的问题:

std::sort(dirs.rbegin(), dirs.rend());