Могу ли я использовать ‘==’ для сравнения двух векторов. Я попробовал и, кажется, работает нормально. Но я не знаю, будет ли это работать в более сложных ситуациях

Первый пример:

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

40

Решение

перегрузка operator == это работает на двух std::vectors будет сравнивать векторные размеры и возвращать 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 == для сравнения отдельных элементов.

57

Другие решения

Да, вы можете использовать operator== сравнить два std::vectors. Он вернется true только если векторы имеют одинаковый размер и все элементы сравниваются одинаково.

6

Имейте в виду, что векторы упорядочены, и 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
3

Вы можете проверить документацию 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

2

Да. Хорошая ссылка cppreference.com, где вы можете посмотреть operator== за vector<T>Например, на этой странице: не являющиеся членами операторы, и вы найдете:

Проверяет, равны ли значения lhs и rhs, т.е.
lhs.size () == rhs.size () и каждый элемент в lhs имеет эквивалент
элемент в rhs в той же позиции.

1

Пока ваш вектор содержит элементы, которые сами по себе можно сравнить (есть operator==), это работает, да. Однако обратите внимание, что если у вас есть вектор, который содержит, например, указатели на идентичные объекты, но не тот же экземпляр объекта, то вектор не считается идентичным, поскольку сравнивается элемент в векторе, а не содержимое элемент как таковой, если это имеет смысл.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector