3

List List1C# で、別の要素に属さないa 内のすべての要素を取得したい場合は、次のList List2ことができます。

var result List1.Except(List2);

std::vectorC++ の s に相当するものはありますか? (C++11 は許可されています)

4

4 に答える 4

6

次の例では、List2 にはない List1 のコンテンツを List3 に取り込みます。それがあなたが探しているものであることを願っています:

std::vector<Type> List1, List2;
//
// populate List1 and List2
//

std::vector<Type> List3;
std::copy_if(List1.begin(), List1.end(), std::back_inserter(List3),
     [&List2](const Type& arg)
     { return (std::find(List2.begin(), List2.end(), arg) == List2.end());});

または、リスト全体を検索して存在しないかどうかを判断する必要がないため、パフォーマンスが向上する可能性があります。むしろ、早期の「ヒット」を取得して、次のノードに移動することができます。述語の論理反転に注意してください。

std::vector<Type> List3;
std::remove_copy_if(List1.begin(), List1.end(), std::back_inserter(List3),
     [&List2](const Type& arg)
     { return (std::find(List2.begin(), List2.end(), arg) != List2.end());});
于 2013-04-02T08:02:02.623 に答える
3

次のような独自の関数を作成する必要があります。

for (auto element : List1)
{
  auto it = std::find(List2.begin(), List2.end(), element);
  if(it == List2.end())
  {
     result.push_back(element);
  }
}
于 2013-04-02T07:49:27.313 に答える
1

任意のコンテナーに対して、常にstd::remove_if+のcontainer::erase組み合わせを使用できます。

    template <typename Cont, typename FwdIt>
    void subtract(Cont& cont, FwdIt first, FwdIt last) {
        using std::begin; using std::end;
        using const_reference = typename Cont::value_type const&;
        cont.erase(std::remove_if(begin(cont), end(cont),
            [first, last](const_reference value){
                return last != std::find(first, last, value);
             }), end(cont));
    }

    template <typename Cont1, typename Cont2>
    void subtract(Cont1& cont1, Cont2 const& cont2) {
        using std::begin; using std::end;
        subtract(cont1, begin(cont2), end(cont2));
    }

専用のメンバー関数があるため、関数std::listをオーバーロードできます。subtractstd::listremove_if

    template <typename T, typename Alloc, typename FwdIt>
    void subtract(std::list<T, Alloc>& l, FwdIt first, FwdIt last) {
        l.remove_if([first, last](T const& value){
            return last != std::find(first, last, value);
        });
    }

    template <typename T, typename Alloc, typename Cont>
    void subtract(std::list<T, Alloc>& l, Cont const& cont) {
        using std::begin; using std::end;
        subtract(l, begin(cont), end(cont));

}

これらの実装は一般的なものであり、シーケンスの並べ替えについては想定していません。2 番目のコンテナーのみが並べ替えられることが保証されている場合は、std::binary_seach代わりにfind. 両方のシーケンスがソートされている場合は、 を使用する必要がありますstd::set_difference

于 2013-04-02T08:35:57.213 に答える