在有序的 STL 容器中查找以前缀开头的所有字符串(非低位 ASCII)
Find all strings (non-lower-ASCII) beginning with a prefix in an ordered STL container
我有一个巨大的 std::string
(数十万个条目)的 STL 容器。我目前正在使用 vector
,但我很乐意更改。内容按字母顺序排序,由字母小写字符 a-z plus ñ
.
组成
我正在尝试实现一个接收 const std::string& prefix
和 returns 一对迭代器的函数,一个指向以该前缀开头的第一个元素,另一个指向最后一个.如果没有字符串匹配条件,return 任何两个相同的迭代器。我需要查找效率,因为向量很大,所以我想利用它进行二进制搜索。
我认为 std::lower_bound
是我要找的,但我缺少比较 std::string
s 的函数,它可以处理西班牙语 ñ
.
您可以使用 std::equal_range
获得整个范围内的相等值。如果集合中至少有一个匹配的字符串,它将为您提供一对迭代器,一个指向范围的开头,一个指向范围的结尾。如果字符串不存在,它将在字符串存在时所属位置之后的第一个位置立即给出两个相等的迭代器。
鉴于您只关心找到相同的子字符串,正常的字符串比较(前 N 个字符)应该可以正常工作。如果你想支持(例如)一对输入字符串之类的东西,并找到它们之间的所有输入,那么你需要从(比如)"m*" 到 "o*" 进行搜索(用你的“ñ* " strings treated as coming between the two) 那么你必须变得更漂亮一点(通常是建立一个排序规则 table ,其中字符代码作为索引,相对顺序作为每个位置的值位置)。
为了按前缀查找单词,正确的结构是trie。您可以采用 public 实现(互联网上有多个实现)并对其进行扩展以满足您的需要。
我有一个巨大的 std::string
(数十万个条目)的 STL 容器。我目前正在使用 vector
,但我很乐意更改。内容按字母顺序排序,由字母小写字符 a-z plus ñ
.
我正在尝试实现一个接收 const std::string& prefix
和 returns 一对迭代器的函数,一个指向以该前缀开头的第一个元素,另一个指向最后一个.如果没有字符串匹配条件,return 任何两个相同的迭代器。我需要查找效率,因为向量很大,所以我想利用它进行二进制搜索。
我认为 std::lower_bound
是我要找的,但我缺少比较 std::string
s 的函数,它可以处理西班牙语 ñ
.
您可以使用 std::equal_range
获得整个范围内的相等值。如果集合中至少有一个匹配的字符串,它将为您提供一对迭代器,一个指向范围的开头,一个指向范围的结尾。如果字符串不存在,它将在字符串存在时所属位置之后的第一个位置立即给出两个相等的迭代器。
鉴于您只关心找到相同的子字符串,正常的字符串比较(前 N 个字符)应该可以正常工作。如果你想支持(例如)一对输入字符串之类的东西,并找到它们之间的所有输入,那么你需要从(比如)"m*" 到 "o*" 进行搜索(用你的“ñ* " strings treated as coming between the two) 那么你必须变得更漂亮一点(通常是建立一个排序规则 table ,其中字符代码作为索引,相对顺序作为每个位置的值位置)。
为了按前缀查找单词,正确的结构是trie。您可以采用 public 实现(互联网上有多个实现)并对其进行扩展以满足您的需要。