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

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

if (vector1 == vector2)
    DoSomething();

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

4 ответа

Решение

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

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

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

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

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

Ваш код (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++ в ближайшее время.

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

Другие вопросы по тегам