Могу ли я использовать '==' для сравнения двух векторов. Я попробовал и, кажется, отлично работает. Но я не знаю, будет ли это работать в более сложных ситуациях
Первый пример:
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
Ответы
Ответ 1
Перегрузка operator ==
, которая работает на двух std::vector
s, будет сравнивать размеры векторов и вернуть false
, если они отличаются; если нет, то он будет сравнивать содержимое элемента-элемента.
Если для типа векторного элемента задан operator ==
, то сравнение векторов через operator ==
является допустимым и значимым.
В формальных выражениях стандарт С++ 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 ==
для сравнения отдельных элементов.
Ответ 2
Да, вы можете использовать operator==
для сравнения двух std::vector
s. Он будет возвращать true
, только если векторы имеют одинаковый размер, и все элементы сравниваются с равными.
Ответ 3
Вы можете проверить документацию operator==
для вектора: operator ==,! =, <, < =, > , >= (std::vector)
Цитата из ссылки:
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 в противном случае
Ответ 4
Имейте в виду, что векторы упорядочены, и std::equal
или оператор ==
проверяют, что векторы имеют одинаковое содержимое в одинаковом порядке. Для многих случаев использования этого может быть достаточно.
Но могут быть случаи, когда вы хотите знать, имеют ли два вектора одинаковое содержимое, но не обязательно в одном и том же порядке. Для этого случая вам нужна другая функция.
Одна хорошая и короткая реализация - ниже. Это было предложено здесь: fooobar.com/questions/181474/... Там вы также найдете обсуждение, почему вы можете не захотеть использовать его...
Поместите это в заголовочный файл на ваш выбор:
#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
Ответ 5
Да. Хорошая ссылка cppreference.com, где вы можете найти operator==
для vector<T>
, например, на этой странице: операторы, не являющиеся членами, и вы найдете:
Проверяет, равно ли содержимое lhs и rhs, то есть lhs.size() == rhs.size(), и каждый элемент в lhs имеет эквивалент элемент в rhs в том же положении.
Ответ 6
Пока ваш вектор содержит элементы, которые сами по себе можно сравнить (есть operator==
), это работает, да. Обратите внимание, что если у вас есть вектор, который содержит, например, указатели на идентичные объекты, но не тот же самый объект объекта, то вектор не считается идентичным, потому что элемент в векторе является тем, что сравнивается, а не с содержимым как таковой, если это имеет смысл.