【发布时间】:2018-01-29 21:35:12
【问题描述】:
我想用 strcmp 对唯一字符串向量进行排序。
std::sort 需要一个谓词来判断一个字符串是否小于另一个字符串,但是 strcmp 实际上已经返回了字符串的关系,并且使用该信息而不是丢失它实际上是明智的。
这很有用,因为它还需要确定字符串是否相等 - 在这种情况下,谓词将再次使用相同的字符串但以相反的参数顺序调用。
这是一种天真的排序方式:
vector<const char*> cache;
sort(cache.begin(), cache.end(), [](const char* left, const char* right)
{
return strcmp(left, right) < 0;
});
我正在尝试以下想法,我存储比较结果并在再次比较相同的字符串时重复使用它。
vector<const char*> cache;
sort(cache.begin(), cache.end(), [notLess = false, r = (const char*)nullptr](const char* left, const char* right) mutable
{
// possibly reuse previous comparison of same strings passed in inverse order
if (notLess &&
r == left)
{
notLess = false;
// always less since vector contains unique strings
return true;
}
if (notLess = strcmp(left, right) >= 0)
r = right;
return !notLess;
});
为了限制存储的信息和额外引入的比较次数,我想只存储right字符串,这成为逆比较的左边。
现在,我的实际问题是仅检查以前的 right 字符串是否足够,还是我还需要存储和检查以前的 left 字符串?
【问题讨论】:
-
标准库可以复制谓词任意次数。
-
“还需要判断字符串是否相等”。你是说
std::sort需要确定吗?它没有。 -
在这种情况下,谓词将使用相同的字符串但以相反的参数顺序再次调用。 -- 据我所知,这仅在调试运行时实现中完成
std::sort运行时正在检查您的谓词是否遵循 strict-weak-order。否则,您无法推测您将在谓词中获得哪两项。 -
@HenriMenke
qsort与std::sort相比是原始的,并且通常更慢。它使用三向比较的能力并没有给它带来任何优势。 -
如果有太空船操作员,可能会添加更快的
std::sort版本。 open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf
标签: c++ string sorting predicate strcmp