在给定字符串向量(按长度排序)的情况下,用于查找等长度字符串范围的惯用C++
Idiomatic C++ for finding a range of equal length strings, given a vector of strings (ordered by length)
给定一个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),虽然我认为这对您的实现也有效,但我不太确定它是否真的有效。它实现了equal_range
的描述所说的对结果正确的比较,并且25.3.3/1不要求模板参数T
必须与迭代器引用的对象的类型完全相同。但我可能错过了一些添加了更多限制的文本,所以在将其用于任何重要内容之前,我会进行更多标准的搜索。
您的方法肯定不是单一的,但必须构造一个具有目标长度的伪字符串看起来不太优雅,也不太可读。
我可能会编写自己的助手函数(即string_length_range
),通过字符串列表封装一个简单明了的循环。没有必要对任何事情都使用std::
工具。
std::equal_range
执行二进制搜索。这意味着words
向量必须排序,在这种情况下,这意味着它的长度必须不递减。
我认为你的解决方案是一个很好的解决方案,肯定比编写自己的二进制搜索实现要好,因为二进制搜索是出了名的容易出错,很难证明是正确的。
如果你无意进行二进制搜索,那么我同意Alexander的观点。简单的for循环单词是最干净的。
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 组合字符串不适用于 libCurl,C++
- 重载 std::字符串运算符+ 用于打印枚举名称
- 用于子集字符串的 Rcpp 函数
- C++ 虽然语句不适用于字符串和"or"
- C++ 用于在数组中打印字符串的随机数
- 用于拆分空格字符串的程序不起作用
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- C ++ txt 文件成数组逐行字符串和 int 用于纸牌游戏
- 为什么我的 if 语句不适用于 c++ 中的字符串?
- C++自定义流操纵器,用于更改流上的下一个字符串
- 如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?
- 将 Delphi 的字符串转换为 std::字符串用于C++
- C :将文本文件的内容存储在2D数组中,作为字符串(用于NULL终结器的麻烦?)
- 如何在 tchar 中添加格式化字符串(用于多个文件名等)
- Google协议缓冲区和std::字符串用于任意二进制数据