Как сравнить два вектора на равенство поэлементно в C++?

Есть ли способ сравнить два вектора?

if (vector1 == vector2)
    DoSomething();

Примечание. В настоящее время эти векторы не отсортированы и содержат целочисленные значения.


person Jame    schedule 06.06.2011    source источник
comment
Вы имеете в виду, что хотите сравнить независимо от порядка элементов в векторе? В противном случае приведенный выше код должен работать.   -  person Naveen    schedule 06.06.2011
comment
Простой способ сравнить, если у вас есть два несортированных массива, которые вы хотите проверить, содержат ли они одинаковые значения, состоит в том, чтобы отсортировать их, а затем использовать любой из стандартных библиотечных методов для сравнения.   -  person    schedule 06.06.2011
comment
Если бы это было так просто. VS2013 использует std::equals для реализации ==, а затем утверждает во время выполнения, потому что итераторы не поступают из одного и того же контейнера (!) Вы должны установить _ITERATOR_DEBUG_LEVEL=1 (или =0) для всех проектов, которые используют или могут использовать ==. Арг!!   -  person Cameron    schedule 24.09.2014
comment
cplusplus.com/reference/vector/vector/operators vector поддерживает как ==, так и < сравнения типов   -  person Andrew    schedule 14.09.2020


Ответы (5)


Проверьте метод std::mismatch C++.

сравнение векторов обсуждалось на форуме DaniWeb, а также отвечали.

C++: сравнение двух векторов

Проверьте сообщение SO ниже. будет полезно для вас. они достигли того же с помощью другого метода-2.

Сравнить два вектора C++

person Jhaliya - Praveen Sharma    schedule 06.06.2011
comment
Это требует сортировки диапазона? - person Naveen; 06.06.2011
comment
lexicographical_compare работает и здесь и избавляет от необходимости иметь дело с тем, какой диапазон является более длинным. - person Billy ONeal; 06.06.2011
comment
Пожалуйста, опубликуйте подробности ссылки, на которую вы ссылаетесь, здесь, если эта ссылка не работает в будущем, весь ответ станет бесполезным. - person Alok Save; 06.06.2011
comment
Плохой ответ. Вы должны предоставить образец кода, а не просто ссылки — что, если они не работают? - person c0dehunter; 07.03.2013
comment
Обратите внимание, что это не влияет на неупорядоченные векторы с произвольным порядком элементов: coliru.stacked-crooked.com/ a/b66b432234265b7e coliru.stacked-crooked.com/a/66300e8d00a16abf - person Zoe; 28.05.2020

Ваш код (vector1 == vector2) является правильным синтаксисом C++. Для векторов существует оператор ==.

Если вы хотите сравнить короткий вектор с частью более длинного вектора, вы можете использовать оператор equal() для векторов. (документация здесь)

Вот пример:

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();
person solvingPuzzles    schedule 29.09.2012
comment
std::equal() также действителен для простых массивов, а оператор равенства — нет, например: int a[1000], b[1000]; if(std::equal(a, a+1000,b)) DoSomething(); - person Muhammad Annaqeeb; 26.04.2014
comment
Хороший ответ, за исключением того, что он поощряет плохую практику (using namespace std) вместо использования более ясного std::equal. - person Fritz; 28.11.2018

Стандарт C++11 для == для std::vector

Другие упомянули, что operator== действительно сравнивает векторное содержимое и работает, но вот цитата из черновик стандарта C++11 N3337, который, как мне кажется, подразумевает это.

Сначала мы рассмотрим Главу 23.2.1 Общие требования к контейнерам, в которой описаны вещи, которые должны быть действительны для всех контейнеров, включая, следовательно, std::vector.

Этот раздел Таблица 96 Требования к контейнерам, который содержит запись:

Expression   Operational semantics
===========  ======================
a == b       distance(a.begin(), a.end()) == distance(b.begin(), b.end()) &&
             equal(a.begin(), a.end(), b.begin())

Часть семантики distance означает, что размер обоих контейнеров одинаков, но указан в обобщенном удобном для итераторов способе для контейнеров с адресацией без произвольного доступа. distance() определяется в 24.4.4 Операции итератора.

Тогда ключевой вопрос заключается в том, что означает equal(). В конце таблицы видим:

Примечания: алгоритм equal() определен в разделе 25.

а в разделе 25.2.11 Equal мы находим его определение:

template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2);

template<class InputIterator1, class InputIterator2,
class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate pred);

1 Возвращает: true, если для каждого итератора i в диапазоне [first1,last1) выполняются следующие соответствующие условия: *i == *(first2 + (i - first1)), pred(*i, *(first2 + (i - first1))) != false. В противном случае возвращает ложь.

В нашем случае нас интересует перегруженная версия без версии BinaryPredicate, которая соответствует первому определению псевдокода *i == *(first2 + (i - first1)), которое, как мы видим, является просто удобным для итератора определением всех повторяющихся элементов.

Аналогичные вопросы для других контейнеров:

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.11.2019

Согласно обсуждению здесь, вы можете напрямую сравнивать два вектора, используя

==

if (vector1 == vector2){
   //true
}
else{
   //false
}
person Shahrukh Haider    schedule 20.03.2018

Если они действительно абсолютно должны оставаться несортированными (чего они действительно не делают... и если вы имеете дело с сотнями тысяч элементов, то я должен спросить, почему вы сравниваете векторы таким образом), вы можете взломать сравнение метод, который работает с несортированными массивами.

Я думал, что единственный способ сделать это — создать временный vector3 и притвориться, что делает set_intersection, добавив к нему все элементы vector1, затем выполнив поиск каждого отдельного элемента vector2 в vector3 и удалив его, если он будет найден. Я знаю, это звучит ужасно, но именно поэтому я не собираюсь в ближайшее время писать какие-либо стандартные библиотеки C++.

На самом деле, просто сначала отсортируйте их.

person Community    schedule 06.06.2011
comment
или можно создать два объекта set и сравнить их? Не проще ли было бы, если бы действительно требовалось не трогать векторы. - person Naveen; 06.06.2011
comment
Зависит от того, насколько быстры N операций поиска и удаления в векторе (N*O(N)) по сравнению с двумя конструкторами наборов, сортирующими N элементов (ссылка на cplusplus.com говорит, что для несортированных последовательностей линейно-логарифмическая (N*logN)..) + отсортированное сравнение (O(N)) . - person ; 06.06.2011