2013-09-24 18 views
2

兩個數組的內容我有詞語的兩個單獨的陣列,例如:如何匹配在C++

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

我不明白'x'是什麼意思,當你說「例如,你輸入」word1 word6「,並且程序給你x」。下一句同樣的問題:) –

+0

你的意思是沒有簽名的WORD? – wengseng

+0

對不起,我的意思是一個普遍的結果 - 在這種情況下,我可能會根據用戶輸入的兩個單詞集執行一些功能。 – Nicholas

回答

5

C++有這樣那樣的問題具有特殊結構,這就是所謂的「地圖」

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"; 
} 
+0

+1由於基於OP的附加評論,這實際上是他正在尋找的 – LihO

0
從我的理解:
  • 你有兩組單詞,
  • 2個詞語從用戶和
  • 你想知道如果這兩個單詞a再包含在這些集合而不是從同一組

這時,你可能做這樣的事情:

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> >與所有可能的組合可能是比較合理的做法,但因爲你寫道:「我知道這將是如果我只是有一個可能的匹配列表更容易...但我想保持兩套字分開「,這可能不是你所期待的。

我希望這有助於以某種方式。

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是在過濾時,它實際上不是)
  4. 它不能產生假陰性(X不在過濾器)
  5. 當綻放過濾器表示過濾器中有東西,您必須查看原始源數據以確保其實際存在。

我用這個方法,該建保持色情應用防火牆和相關的垃圾關閉網絡和它加速該特定代碼的向上超過400次相對於在傳統的地圖或哈希表存儲。

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.(根據鏈接)。