如何在C ++中匹配两个数组的内容

时间:2013-09-24 07:10:01

标签: c++ arrays string set containers

我有两个单独的单词数组,例如:

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]组合是否与第三个可能的组合列表。如果确实如此,我会根据它的组合拆分响应。

我知道如果我只有一个可能的匹配列表会更容易,并在输入字符串中找到 。但我想保持两组单词分开,因为代码会更灵活(我会以这种方式学习更多)。

希望有人可以给我一些关于如何进行的提示?

4 个答案:

答案 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)

据我所知:
  • 你有2套词,
  • 来自用户的2个字和
  • 你想知道这两个单词是否包含在这些集合中但不是来自同一集合

然后你可以做类似的事情:

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必须来自wordSet1word2必须来自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

关于布隆过滤器的一些注意事项:

  1. 看起来很快。
  2. 使用良好,快速的哈希函数。互联网上有吨数
  3. 它可以产生误报(当X实际上不是时,X在过滤器中)
  4. 它不能生成假阴性(X不在过滤器中)
  5. 当布隆过滤器显示过滤器中存在某些内容时,您必须查看原始源数据以确保它实际存在。
  6. 我将这种方法与一个应用程序防火墙结合使用,该防火墙用于将色情内容和相关垃圾从网络中删除,并且与传统的地图或哈希表相比,它可以将特定代码加速400多倍。