Подтвердить что ты не робот

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

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

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 
4b9b3361

Ответ 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==), это работает, да. Обратите внимание, что если у вас есть вектор, который содержит, например, указатели на идентичные объекты, но не тот же самый объект объекта, то вектор не считается идентичным, потому что элемент в векторе является тем, что сравнивается, а не с содержимым как таковой, если это имеет смысл.