Как сравнить два вектора
Перейти к содержимому

Как сравнить два вектора

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

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

4 ответов

Регистрация std::mismatch метод C++.

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

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

ваш код ( vector1 == vector2 ) — правильный синтаксис C++. Есть == оператора для векторов.

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

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

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

Как сравнить два вектора

Для добавления элементов в вектор применяется функция push_back() , в который передается добавляемый элемент:

Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.

Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:

Добавление элементов на определенную позицию

Ряд функций позволяет добавлять элементы на определенную позицию.

emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos

insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace

insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos

insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end

insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos

Удаление элементов

Если необходимо удалить все элементы вектора, то можно использовать функцию clear :

Функция pop_back() удаляет последний элемент вектора:

Если нужно удалить элемент из середины или начала контейнера, применяется функция erase() , которая имеет следующие формы:

erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент

erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

Размер вектора

С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:

С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:

resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию

resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value

Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.

Изменение элементов вектора

Функция assign() позволяет заменить все элементы вектора определенным набором:

В данном случае элементы вектора заменяются набором из четырех строк «Sam».

Еще одна функция — swap() обменивает значения двух контейнеров:

Сравнение векторов

Векторы можно сравнивать. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:

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

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

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

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

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

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

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

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

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

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

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

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

Notes: the algorithm equal() is defined in Clause 25.

а в разделе 25.2.11 «Равно» находим его определение:

1 Returns: true if for every iterator i in the range [first1,last1) the following corresponding conditions hold: *i == *(first2 + (i — first1)) , pred(*i, *(first2 + (i — first1))) != false . Otherwise, returns false.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *