Первый пример:
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
Второй пример:
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
перегрузка operator ==
это работает на двух std::vector
s будет сравнивать векторные размеры и возвращать 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==
сравнить два std::vector
s. Он вернется true
только если векторы имеют одинаковый размер и все элементы сравниваются одинаково.
Имейте в виду, что векторы упорядочены, и std::equal
или ==
Оператор проверяет, что векторы имеют одинаковое содержимое в одинаковом порядке. Для многих случаев использования этого может быть достаточно.
Но могут быть случаи, когда вы хотите знать, имеют ли два вектора одинаковое содержимое, но не обязательно в одном и том же порядке. Для этого случая вам нужна другая функция.
Одна хорошая и короткая реализация — ниже.
Было предложено здесь: 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==
для вектора: оператор ==,! =,<,<=,>,> = (Станд :: вектор)
Цитирование по ссылке:
template< class T, class Alloc >
bool operator==( vector<T,Alloc>& lhs,
vector<T,Alloc>& rhs );
Сравнивает содержимое двух контейнеров.
Проверяет, равны ли значения lhs и rhs, то есть, имеет ли lhs.size () == rhs.size () и имеет ли каждый элемент в lhs эквивалентный элемент в rhs в той же позиции.
параметры:
контейнеры lhs, rhs, содержимое которых нужно сравнить
T должен соответствовать требованиям EqualityComparable для использования версий
Возвращаемое значение
true, если содержимое контейнеров эквивалентно, иначе false
Да. Хорошая ссылка cppreference.com, где вы можете посмотреть operator==
за vector<T>
Например, на этой странице: не являющиеся членами операторы, и вы найдете:
Проверяет, равны ли значения lhs и rhs, т.е.
lhs.size () == rhs.size () и каждый элемент в lhs имеет эквивалент
элемент в rhs в той же позиции.
Пока ваш вектор содержит элементы, которые сами по себе можно сравнить (есть operator==
), это работает, да. Однако обратите внимание, что если у вас есть вектор, который содержит, например, указатели на идентичные объекты, но не тот же экземпляр объекта, то вектор не считается идентичным, поскольку сравнивается элемент в векторе, а не содержимое элемент как таковой, если это имеет смысл.