C++: сравнение двух векторов
Есть ли способ сравнить два вектора?
if (vector1 == vector2)
DoSomething();
Примечание. В настоящее время эти векторы не отсортированы и содержат целочисленные значения.
4 ответа
Проверьте std::mismatch
метод С ++.
сравнение векторов обсуждалось на форуме DaniWeb и также отвечало.
Проверьте ниже ТАК сообщение. будет полезно для вас. они достигли того же с другим методом-2.
Ваш код (vector1 == vector2
) правильный синтаксис C++. Есть ==
оператор для векторов.
Если вы хотите сравнить короткий вектор с частью более длинного вектора, вы можете использоватьequal()
оператор для векторов. ( документация здесь)
Вот пример:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
Стандарт 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 "Равный" мы находим его определение:
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 Возвращает: истина, если для каждого итератора i в диапазоне
[first1,last1)
выполняются соответствующие условия:*i == *(first2 + (i - first1))
,pred(*i, *(first2 + (i - first1))) != false
. В противном случае возвращает false.
В нашем случае мы заботимся о перегруженной версии без BinaryPredicate
версия, которая соответствует первому определению псевдокода *i == *(first2 + (i - first1))
, которое, как мы видим, является просто понятным для итератора определением "все повторяющиеся элементы одинаковы".
Аналогичные вопросы для других контейнеров:
Согласно обсуждению здесь вы можете напрямую сравнить два вектора, используя
==
if (vector1 == vector2){
//true
}
else{
//false
}
Если они действительно должны оставаться несортированными (чего они на самом деле не делают... и если вы имеете дело с сотнями тысяч элементов, то я должен спросить, почему вы сравниваете векторы вот так), вы можете сравнить результаты сравнения. метод, который работает с несортированными массивами.
Единственный способ сделать это - создать временный vector3
и притворяться, чтобы сделать set_intersection
добавив все элементы vector1
к нему, а затем делает поиск для каждого отдельного элемента vector2
в vector3
и удалить его, если найден. Я знаю, это звучит ужасно, но поэтому я не пишу никаких стандартных библиотек C++ в ближайшее время.
На самом деле, просто рассортируйте их в первую очередь.