比较已知字符串和字符串数组以查看给定字符串是否与数组中的任何字符串匹配的最有效方法是什么?
例如:你有
string String1 = "ID5";
string String2 = "ID7";
您想知道其中任何一个是否包含在以下
中string List[5] = {"ID1", "ID7", "ID10", "ID34", "ID62"}
这样你就能做到这一点
if(#STRINGMATCHES) {
// Do one thing
}
else {
// Do another
}
答案 0 :(得分:2)
使用 std::find
std::find(List, List+5, String1)
答案 1 :(得分:2)
如果你需要执行这个搜索操作,我在这里提出了很多次 - 使用一些哈希函数散列所有字符串,然后创建一个包含已排序哈希值的新数组。然后,当您需要检查数组中是否包含字符串时,请在已排序的数组中执行其哈希的binary_search。这比使用als提出的std :: find更有效,但取决于你需要执行足够多次搜索操作的事实,以便速度增益弥补排序开销。
答案 2 :(得分:1)
如果数组已排序,您可以使用std::binary_search()
:
std::string List[] = { "ID1", "ID10", "ID7", "ID34", "ID62" };
if (std::binary_search(std::begin(List), std::end(List), "ID7"))
{
std::cout << "found string\n";
}
如果没有,请使用std::find()
(如Als已经说明的那样)。
答案 3 :(得分:1)
最简单的解决方案是放置您正在寻找的字符串
到数组并使用std::find_first_of
:
std::string targetList[] = { "ID5", "ID7" };
std::string searchList[] = { "ID1", "ID2", "ID3", "ID4", "ID5" };
if ( std::find_first_of( begin( searchList ), end( searchList ),
begin( targetList ), end( targetList ) )
!= end( targetList ) ) {
// found...
} else {
// not found...
}
这不一定是最有效的解决方案,因为
find_first_of
对数据不作任何解释。如果搜索
list非常大,并且不会更改,例如,目标列表
只包含一些元素,排序可能更有效
搜索列表,并对目标列表中的每个元素进行二进制搜索。
答案 4 :(得分:0)
我有个主意。
首先,我们应该将List sorted.just设为hmjd描述。
比较两个字符串时,我们可以记录一些信息。
例如,
table two dimenssion array dif记录两个字符串不同的索引。
string[2] = {"abc","abd"}
list[5] = {"aab","abb","abc","bcd","ef"}
dif[0][0] = 1 ("abc" and "aab" differ at index 1)
dif[0][1] = 2 ("abc" and "abb" differ at index 2)
dif[0][2] = -1 ("abc" and "abc" are same, so we use -1 to represent two strings are same)
dif[0][3] = 0 ("abc" and "bcd" differ at index 0)
dif[0][4] = 0 ("abc" and "eg" differ at index 0)
当我们需要将新字符串与list中的字符串进行比较时。我们首先在已经比较的字符串中找到最相似的字符串。例如,“abd”是判断所需的字符串。我们找到“abc”。 “abd”和“abc”在索引2处不同。因此,当我们比较“adb”和列表中的字符串时,我们不需要在2之前比较索引中不同“abc”的字符串。例如,我们不需要比较“abd”和“ef”,因为“abd”在索引2处不同“abc”,而“abc”在索引0处不同“ef”。
我的想法非常粗糙,需要考虑许多细节。我认为这很有用,特别是在大规模问题上。