2

たとえば、次のように、単語の 2 つの個別の配列があります。

array1 = word1, word2, word3
array2 = word4, word5, word6

ユーザー入力 (2 語になります) に基づいて 2 つの配列を一致させようとしています。たとえば、「word1 word6」と入力すると、プログラムは x を返します。「word3 word4」と入力すると、プログラムは y を返します。各配列内で一致する必要はありません/すべきではありません (したがって、「word1 word3」と入力してもエラー以外は何も返されません)。

今、string::find入力文字列の各配列の内容を探すために使用することを考えていました。ただし、その後、これらの結果 (ある場合) を取得し、それらを互いに照合する方法に固執しています。

たとえば、input.find(contents of array1)何かが見つかった場合はそれを取得し、同じ入力の別の行で見つかった との組み合わせが可能な組み合わせの 3 番目のリストと一致するarray1[x]かどうかを確認します。array2[x]もしそうなら、それがどのコンボであるかに基づいて応答を分割します。

可能な一致のリストがあれば、それが入力文字列で見つかった方が簡単だと思います。しかし、コードがより柔軟になるので、2 つの単語セットを分けておきたいと思いました (そして、この方法でより多くのことを学べます)。

うまくいけば、誰かが続行する方法についてのヒントを教えてくれますか?

4

4 に答える 4

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";
}
于 2013-09-24T07:27:17.313 に答える
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());

10 と 20 の 20 要素を持つベクトルになります (リンクによる)。

于 2013-09-24T08:29:02.170 に答える