最初の例:
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
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 ==
_を使用します。
はい、使用できます operator==
2つのstd::vector
s。ベクトルが同じサイズで、すべての要素が等しい場合にのみ、true
を返します。
ベクトルは順序付けられ、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
ベクターの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
ベクターにそれ自体で比較できる要素が含まれている限り(operator==
)、これは機能します、はい。ただし、たとえば、同一オブジェクトへのポインタを含むが、オブジェクトの同じインスタンスを含まないベクターがある場合、ベクターの要素は比較されるものであり、ベクターの内容ではないため、ベクターは同一とは見なされないことに注意してくださいそのような要素、それが理にかなっている場合。
はい。適切なリファレンスは cppreference.com です。ここでoperator==
ために vector<T>
、このページの例: 非メンバー演算子
Lhsとrhsの内容が等しいかどうか、つまりlhs.size()== rhs.size()とlhsの各要素が同じ位置でrhsに同等の要素を持っているかどうかをチェックします。