给定字符串向量按长度排序的惯用C ++,用于查找等长字符串的范围

问题描述

给定
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 );
是否有一种标准的方法(美观)?     

解决方法

        我希望您可以编写一个比较器,如下所示:
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),尽管我认为这也将对您的实现有效,但是我不确定它是否有效。它实现了比较结果,即ѭ5的描述对结果是正确的,并且25.3.3 / 1不需要模板参数
T
必须准确地是迭代器引用的对象的类型。但是我可能会错过一些文本,这些文本增加了更多的限制,因此在将其用于任何重要的事情之前,我会进行更多的标准研究。     ,        您的方法肯定不是唯一的方法,但是必须构造具有目标长度的伪字符串看起来并不十分优雅,也不太可读。 我也许会编写自己的辅助函数(即
string_length_range
),并封装一个简单的遍历字符串列表的循环。无需对所有工具都使用
std::
工具。     ,        
std::equal_range
进行二进制搜索。这意味着必须对“ 10”向量进行排序,在这种情况下,这意味着它的长度必须不减小。 我认为您的解决方案是一个很好的解决方案,绝对比编写自己的二进制搜索实现要好,众所周知,二进制搜索容易出错且难以证明是正确的。 如果不是要进行二进制搜索,那么我同意亚历山大的观点。仅通过单词进行简单的for循环是最干净的。