我有两个单独的单词数组,例如:
array1 = word1, word2, word3
array2 = word4, word5, word6
我试图根据用户输入(这将是2个单词)匹配两个数组。 例如,您输入“word1 word6”,程序会给你x。你输入“word3 word4”,程序给你y。在每个数组中不需要/不应该匹配(因此输入“word1 word3”不应该提供除错误之外的任何内容)。
现在,我正在考虑使用string::find
来查找输入字符串中每个数组的内容。然而,在那之后,我仍然坚持如何获取这些结果(如果有的话)并将它们相互匹配。
例如,我会input.find(contents of array1)
,如果找到了某些内容,请取出array1[x]
,然后查看通过同一输入中的单独行找到的array2[x]
组合是否与第三个可能的组合列表。如果确实如此,我会根据它的组合拆分响应。
我知道如果我只有一个可能的匹配列表会更容易,并在输入字符串中找到 。但我想保持两组单词分开,因为代码会更灵活(我会以这种方式学习更多)。
希望有人可以给我一些关于如何进行的提示?
答案 0 :(得分:5)
C ++有这种问题的特殊结构,它被称为“map”
typedef std::map< std::pair< std::string, std:: string >, int > MyMapType;
MyMapType my_map;
上面是一个给定一对字符串返回int的映射。当然,并不是所有可能的字符串对都需要包含在地图中:
my_map[std::make_pair("A", "B")] = 42;
my_map[std::make_pair("A", "C")] = 99;
my_map[std::make_pair("B", "D")] = 103;
要查看是否存在特定对,您可以使用map::find
:
MyMapType::iterator i = my_map.find(std::make_pair(x, y));
if (i == my_map.end()) {
std::cout << "Pair is not defined\n";
} else {
// Pair is present
std::cout << "Associated value is " << *i << "\n";
}
答案 1 :(得分:1)
最简单的选择不是使用std::set_intersection来获取公共元素。你确实需要排序的输入。
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
it=std::set_intersection (first, first+5, second, second+5, v.begin());
将导致包含20个元素的向量:10和20.(根据链接)。
答案 2 :(得分:0)
然后你可以做类似的事情:
inline const bool isIn(const std::set<std::word>& s, const std::string& e) {
return s.find(e) != s.end();
}
...
std::set<std::string> wordSet1, wordSet2;
std::string word1, word2; // <-- from the user
...
if (isIn(wordSet1, word1) && isIn(wordSet2, word2)) {
// success
}
else if (isIn(wordSet2, word1) && isIn(wordSet1, word2) {
// success
}
else {
// fail
}
但由于std::set::find
的复杂性为O(log n),并且这种方法称之为4次,因此效果不是很好。另请注意,如果订单定义明确,即word1
必须来自wordSet1
且word2
必须来自wordSet2
,则第二个条件(else if
)应为删去。
如果订单定义明确且您需要多次查找这些对,那么创建具有所有可能组合的临时std::set< std::pair<std::string, std::string> >
可能是更合理的方法,但是因为您写了:“我知道如果我只有一个可能的匹配列表会更容易......但我想将两组单词分开“,这可能不是你想要的。
我希望这会有所帮助。
答案 3 :(得分:0)
按照您喜欢的方式存储您的文字,并将可搜索的组合放在布隆过滤器中。
最常见形式的伪代码......:
插入:
for words in wordArray: bloomFilter.add( words.hash() )
搜索:
found = false if bloomFilter.contains( searchedForWords.hash() ): if originalWordList.contains( words ) found = true
关于布隆过滤器的一些注意事项:
我将这种方法与一个应用程序防火墙结合使用,该防火墙用于将色情内容和相关垃圾从网络中删除,并且与传统的地图或哈希表相比,它可以将特定代码加速400多倍。