给定std::vector< std::string >
,向量按字符串长度排序,如何找到等长度的范围?
我期待C ++中的惯用解决方案。
我找到了这个解决方案:
// any idea for a better name? (English is not my mother tongue)
bool less_length( const std::string& lhs, const std::string& rhs )
{
return lhs.length() < rhs.length();
}
std::vector< std::string > words;
words.push_back("ape");
words.push_back("cat");
words.push_back("dog");
words.push_back("camel");
size_t length = 3;
// this will give a range from "ape" to "dog" (included):
std::equal_range( words.begin(), words.end(), std::string( length, 'a' ), less_length );
有没有一种标准的方法(精美)?
答案 0 :(得分:5)
我希望您可以按如下方式编写比较器:
struct LengthComparator {
bool operator()(const std::string &lhs, std::string::size_type rhs) {
return lhs.size() < rhs;
}
bool operator()(std::string::size_type lhs, const std::string &rhs) {
return lhs < rhs.size();
}
bool operator()(const std::string &lhs, const std::string &rhs) {
return lhs.size() < rhs.size();
}
};
然后使用它:
std::equal_range(words.begin(), words.end(), length, LengthComparator());
我希望永远不会使用operator()
的第三个重载,因为它提供的信息是多余的。范围必须预先排序,因此算法比较范围中的两个项目是没有意义的,应该将范围中的项目与您提供的目标进行比较。但标准并不保证。 [编辑:并定义所有三个意味着你可以使用相同的比较器类将矢量按顺序排列,这可能很方便]。
这适用于我(gcc 4.3.4),虽然我认为这也适用于你的实现,但我不太确定它实际上是有效的。它实现了equal_range
的描述对结果是正确的比较,而25.3.3 / 1不要求模板参数T
必须完全是所引用的对象的类型由迭代器。但是可能会有一些我错过的文字增加了更多的限制,所以在使用它之前我会做更多的标准拖网。
答案 1 :(得分:2)
你的方式绝对不是单一的,但是必须构建一个具有目标长度的虚拟字符串看起来不是很优雅,也不是很易读。
我可能会编写自己的辅助函数(即string_length_range
),通过字符串列表封装一个简单的简单循环。没有必要使用std::
工具。
答案 2 :(得分:0)
std::equal_range
进行二分查找。这意味着必须对words
向量进行排序,在这种情况下,它意味着它的长度必须不减少。
我认为你的解决方案是一个很好的解决方案,绝对比编写你自己的二进制搜索实现更好,这种方法很容易出错并且难以证明是正确的。
如果进行二元搜索不是你的意图,那么我同意亚历山大。只是一个简单的循环通过单词是最干净的。