если один вектор содержит элементы в порядке (a, b, c), а другой - в порядке (b, c, a), оператор == вернет false, даже если они совместно используют одни и те же данные.
Просто вставьте данные в два контейнера, где порядок не имеет значения, и сравните их:
std::vector<CString> vec1;
std::vector<CString> vec2;
// ...
std::multiset<CString> set1(vec1.begin(), vec1.end());
std::multiset<CString> set2(vec2.begin(), vec2.end());
bool equal_data = (set1 == set2);
Если вы хотите игнорировать регистр (который, по-видимому, предлагает код в вашем вопросе), вы можете параметризовать std::multiset
и std::equal
с помощью соответствующего компаратора:
struct compareNoCase
{
bool operator()(const CString& a, const CString& b)
{
return a.CompareNoCase(b);
}
};
std::vector<CString> vec1;
std::vector<CString> vec2;
// ...
std::multiset<CString> set1(vec1.begin(), vec1.end(), compareNoCase());
std::multiset<CString> set2(vec2.begin(), vec2.end(), compareNoCase());
bool equal_data = std::equal(set1.begin(), set1.end(),
set2.begin(),
compareNoCase());
Параметризация std::multiset
гарантирует, что "привет" и "HELLO" в одном и том же векторе будут рассматриваться как одно значение, а параметризация std::equal
гарантирует это для двух векторов.
И, наконец, если вы знаете, что ни один элемент не встречается дважды в одном и том же vector
, вы можете использовать set
вместо multiset
. Обратите внимание, что, вероятно, лучше работать с set
или multiset
с самого начала.