-1

私は2つsets持っています。それらにはいくつかの共通要素があります(セットには要素として文字列があります)

like : set1要素あり

"1-2","1-1","3-4"

set2要素があります

"1-2","1-3","3-4"

値「1-1」を1つのセットに、値「1-3」を別のセットに取り出したい。私は私set_differenceのために仕事をすることを知っています.しかし、私はいくつかの問題に直面しています.こちらset_ifferenceを確認してください

set_difference同じ結果を達成するために使用する代替手段はありますか?

4

1 に答える 1

3

別の方法は、 Kerrek SB が質問への回答で行ったように、自分でロールすることです。

std::set_difference()とはいえ、問題を回避するよりも、問題を理解して解決する方がはるかに良いでしょう。

たとえば、 をtemplates含む行に関連する長いコンパイラ エラーが発生した場合set_difference、これを小さな一連の個別の単純なステートメントに分割します。これにより、エラーの特定がはるかに簡単になります。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>

int main()
{
    typedef std::set<std::string> set_of_strings;
    set_of_strings s1, s2, result;

    s1.insert("1-2");
    s1.insert("1-1");
    s1.insert("3-4");

    s2.insert("1-2");
    s2.insert("1-3");
    s2.insert("3-4");

    // Temporary variables for debugging only
    set_of_strings::iterator s1_begin = s1.begin();
    set_of_strings::iterator s1_end = s1.end();
    set_of_strings::iterator s2_begin = s2.begin();
    set_of_strings::iterator s2_end = s2.end();
    set_of_strings::iterator result_end = result.end();
    std::insert_iterator<set_of_strings> result_inserter = std::inserter(result, result_end);

    std::set_difference(s1_begin, s1_end,
                        s2_begin, s2_end,
                        result_inserter);

    std::copy(result.begin(),
              result.end(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

次に、コンパイラは、set_differenceの 5 つのパラメーターのそれぞれが期待する型であることを確認し、それらがすべて別々のステートメントで宣言されているため、どのパラメーターが問題を引き起こしているかを非常に迅速に確認できるようにします。

もちろん、問題を解決したら、リファクタリングして不要な変数を削除します。

于 2011-12-26T20:06:47.057 に答える