是否可以根据复杂的标准使用 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
没有提供预期结果的原因是什么?
- 有没有办法使用
std::sort()
函数实现上述排序?
- 如果是,我做错了什么?
- 如果不是,上述
BubbleSortDirs()
函数是实现此类排序的最佳方法,还是存在更好的方法?
我终于这样解决了我的问题:
std::sort(dirs.rbegin(), dirs.rend());
我需要对包含文件夹名称的 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
没有提供预期结果的原因是什么? - 有没有办法使用
std::sort()
函数实现上述排序? - 如果是,我做错了什么?
- 如果不是,上述
BubbleSortDirs()
函数是实现此类排序的最佳方法,还是存在更好的方法?
我终于这样解决了我的问题:
std::sort(dirs.rbegin(), dirs.rend());