web-dev-qa-db-ja.com

'=='を使用して2つのベクトルを比較できますか。私はそれを試してみましたが、うまく機能しているようです。しかし、より複雑な状況で機能するかどうかはわかりません

最初の例:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 30, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns equal 

2番目の例:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 100000, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns notequal 
44
suman shadow

2つの_operator ==_ s で機能する_std::vector_のオーバーロードは、ベクトルサイズを比較し、それらが異なる場合はfalseを返します。そうでない場合は、要素ごとにベクトルの内容を比較します。

_operator ==_がベクターの要素タイプに対して定義されている場合、_operator ==_を介したベクターの比較は有効で意味があります。

正式な用語では、C++ 11標準は、シーケンスコンテナの_a == b_の動作セマンティクスを次のように指定します(表96、§23.2.1)。

_==_は同値関係です。

distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())

ご覧のように、シーケンスコンテナ間の同等性は _std::equal_ 反復子のペアで定義された範囲間のアルゴリズムで定義され、個々の要素の比較に_operator ==_を使用します。

65
Andy Prowl

はい、使用できます operator== 2つのstd::vectors。ベクトルが同じサイズで、すべての要素が等しい場合にのみ、trueを返します。

7

ベクトルは順序付けられ、std::equal または ==演算子は、ベクトルが同じ順序で同じ内容を持っていることを確認します。多くのユースケースでは、これで十分かもしれません。

ただし、2つのベクトルの内容が同じであるが、必ずしも同じ順序ではないかどうかを知りたい場合があります。その場合、別の機能が必要です。

ニースで短い実装の1つは、次の実装です。ここで提案されました: https://stackoverflow.com/questions/17394149/how-to-efficiently-compare-vectors-with-c/17394298#17394298 また、なぜそれを使用したくないかもしれないかについての議論を見つけるでしょう...

これを選択したヘッダーファイルに入れます。

#include <algorithm>

template <class T>
static bool compareVectors(std::vector<T> a, std::vector<T> b)
{
   if (a.size() != b.size())
   {
      return false;
   }
   ::std::sort(a.begin(), a.end());
   ::std::sort(b.begin(), b.end());
   return (a == b);
}

そして、上記の理論を説明する例:

std::vector<int> vector1;
std::vector<int> vector2;

vector1.Push_back(100);
vector1.Push_back(101);
vector1.Push_back(102);

vector2.Push_back(102);
vector2.Push_back(101);
vector2.Push_back(100);

if (vector1 == vector2)
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

if (std::equal(vector1.begin(), vector1.end(), vector2.begin()))
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

if (compareVectors(vector1, vector2))
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

出力は次のようになります。

not same
not same
same
3
Tony

ベクターのoperator==のドキュメントを確認できます。 operator ==、!=、<、<=、>、> =(std :: vector)

リンクから引用:

 template< class T, class Alloc >
 bool operator==( vector<T,Alloc>& lhs,
             vector<T,Alloc>& rhs );

2つのコンテナの内容を比較します。

Lhsとrhsの内容が等しいかどうか、つまりlhs.size()== rhs.size()とlhsの各要素が同じ位置でrhsに同等の要素を持っているかどうかをチェックします。

パラメーター:

内容を比較するlhs、rhsコンテナ

Tは、バージョンを使用するためにEqualityComparableの要件を満たす必要があります

戻り値

コンテナの内容が同等の場合はtrue、そうでない場合はfalse

2
taocp

ベクターにそれ自体で比較できる要素が含まれている限り(operator==)、これは機能します、はい。ただし、たとえば、同一オブジェクトへのポインタを含むが、オブジェクトの同じインスタンスを含まないベクターがある場合、ベクターの要素は比較されるものであり、ベクターの内容ではないため、ベクターは同一とは見なされないことに注意してくださいそのような要素、それが理にかなっている場合。

1
Mats Petersson

はい。適切なリファレンスは cppreference.com です。ここでoperator== ために vector<T>、このページの例: 非メンバー演算子

Lhsとrhsの内容が等しいかどうか、つまりlhs.size()== rhs.size()とlhsの各要素が同じ位置でrhsに同等の要素を持っているかどうかをチェックします。

1
huskerchad