Есть ли способ сравнить два вектора?
if (vector1 == vector2)
DoSomething();
Примечание. В настоящее время эти векторы не отсортированы и содержат целочисленные значения.
Есть ли способ сравнить два вектора?
if (vector1 == vector2)
DoSomething();
Примечание. В настоящее время эти векторы не отсортированы и содержат целочисленные значения.
Проверьте метод std::mismatch
C++.
сравнение векторов обсуждалось на форуме DaniWeb, а также отвечали.
Проверьте сообщение SO ниже. будет полезно для вас. они достигли того же с помощью другого метода-2.
lexicographical_compare
работает и здесь и избавляет от необходимости иметь дело с тем, какой диапазон является более длинным.
- person Billy ONeal; 06.06.2011
Ваш код (vector1 == vector2
) является правильным синтаксисом C++. Для векторов существует оператор ==
.
Если вы хотите сравнить короткий вектор с частью более длинного вектора, вы можете использовать оператор equal()
для векторов. (документация здесь)
Вот пример:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
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))
, которое, как мы видим, является просто удобным для итератора определением всех повторяющихся элементов.
Аналогичные вопросы для других контейнеров:
Согласно обсуждению здесь, вы можете напрямую сравнивать два вектора, используя
==
if (vector1 == vector2){
//true
}
else{
//false
}
Если они действительно абсолютно должны оставаться несортированными (чего они действительно не делают... и если вы имеете дело с сотнями тысяч элементов, то я должен спросить, почему вы сравниваете векторы таким образом), вы можете взломать сравнение метод, который работает с несортированными массивами.
Я думал, что единственный способ сделать это — создать временный vector3
и притвориться, что делает set_intersection
, добавив к нему все элементы vector1
, затем выполнив поиск каждого отдельного элемента vector2
в vector3
и удалив его, если он будет найден. Я знаю, это звучит ужасно, но именно поэтому я не собираюсь в ближайшее время писать какие-либо стандартные библиотеки C++.
На самом деле, просто сначала отсортируйте их.
set
и сравнить их? Не проще ли было бы, если бы действительно требовалось не трогать векторы.
- person Naveen; 06.06.2011
N*O(N)
) по сравнению с двумя конструкторами наборов, сортирующими N элементов (ссылка на cplusplus.com говорит, что для несортированных последовательностей линейно-логарифмическая (N*logN)..) + отсортированное сравнение (O(N)
) .
- person ; 06.06.2011
std::equals
для реализации==
, а затем утверждает во время выполнения, потому что итераторы не поступают из одного и того же контейнера (!) Вы должны установить_ITERATOR_DEBUG_LEVEL=1
(или=0
) для всех проектов, которые используют или могут использовать==
. Арг!! - person Cameron   schedule 24.09.2014vector
поддерживает как==
, так и<
сравнения типов - person Andrew   schedule 14.09.2020