std::set_symmetric_difference
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody>| Определено в заголовочном файле <algorithm>
|
||
template< class InputIt1, class InputIt2, class OutputIt > OutputIt set_symmetric_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first ); |
(1) | |
template< class InputIt1, class InputIt2, class OutputIt, class Compare > OutputIt set_symmetric_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first, Compare comp ); |
(2) | |
[first1, last1), которые не встречаются в отсортированном [first2, last2) диапазона и элементы из отсортированного диапазона [first2, last2), которые не встречаются в отсортированном диапазоне [first1, last1) в диапазоне начиная с d_first. В результате диапазон также отсортировать. Первая версия ожидает, что обе входные диапазоны должны быть отсортированы с operator<, вторая версия ожидает, что они должны быть отсортированы с данной comp функцию сравнения. Если некоторый элемент не найден m раз в [first1, last1) и n раз в [first2, last2), он будет скопирован в d_first точно std::abs(m-n) раз. Если m>n, то последний m-n эти элементы копируются из [first1,last1), в противном случае последний элементы n-m копируются из [first2,last2). В результате диапазон не должен пересекаться с любым из входных диапазонов.[first1, last1) which are not found in the sorted range [first2, last2) and the elements from the sorted range [first2, last2) which are not found in the sorted range [first1, last1) to the range beginning at d_first. The resulting range is also sorted. The first version expects both input ranges to be sorted with operator<, the second version expects them to be sorted with the given comparison function comp. If some element is found m times in [first1, last1) and n times in [first2, last2), it will be copied to d_first exactly std::abs(m-n) times. If m>n, then the last m-n of those elements are copied from [first1,last1), otherwise the last n-m elements are copied from [first2,last2). The resulting range cannot overlap with either of the input ranges.Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Параметры
| first1, last1 | — | сначала сортируется диапазона элементов
Оригинал: the first sorted range of elements Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| first2, last2 | — | второй отсортированный диапазон элементов
Оригинал: the second sorted range of elements Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| comp | — | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент "меньше", чем второй.Определение сравнения должно быть эквивалентно:
Использование |
| Требования к типам | ||
-InputIt1 должен соответствовать требованиям InputIterator.
| ||
-InputIt2 должен соответствовать требованиям InputIterator.
| ||
-OutputIt должен соответствовать требованиям OutputIterator.
| ||
Возвращаемое значение
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сложность
= std::distance(first1, last1) и N2 = std::distance(first2, last2).= std::distance(first1, last1) and N2 = std::distance(first2, last2).Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Возможная реализация
| Первый вариант |
|---|
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_difference(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first)
{
while (first1 != last1) {
if (first2 == last2) return std::copy(first1, last1, d_first);
if (*first1 < *first2) {
*d_first++ = *first1++;
} else {
if (*first2 < *first1) {
*d_first++ = *first2;
} else {
++first1;
}
++first2;
}
}
return std::copy(first2, last2, d_first);
}
|
| Второй вариант |
template<class InputIt1, class InputIt2,
class OutputIt, class Compare>
OutputIt set_difference(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first, Compare comp)
{
while (first1 != last1) {
if (first2 == last2) return std::copy(first1, last1, d_first);
if (comp(*first1, *first2)) {
*d_first++ = *first1++;
} else {
if (comp(*first2, *first1)) {
*d_first++ = *first2;
} else {
++first1;
}
++first2;
}
}
return std::copy(first2, last2, d_first);
}
|
Пример
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> v1{1,2,3,4,5,6,7,8 };
std::vector<int> v2{ 5, 7, 9,10};
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector<int> v_intersection;
std::set_symmetric_difference(
v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(v_intersection));
for(int n : v_intersection)
std::cout << n << ' ';
}
Вывод:
1 2 3 4 6 8 9 10
См. также
возвращает true, если одна последовательность является подпоследовательностью другой (шаблон функции) | |
| вычисляет разницу между двумя наборами (шаблон функции) | |
| вычисляет объединение двух множеств (шаблон функции) | |
| вычисляет пересечение двух множеств (шаблон функции) |