std :: set_difference для списка контейнеров

Я пытаюсь вызвать функцию set_difference и поместить результат в std :: list. Теоретически, это можно сделать на любом отсортированном контейнере, верно?

list<int> v;

list<int> l1;
list<int> l2;

list<int>::iterator it;

//l1 and l2 are filled here

l1.sort();
l2.sort();

it=set_difference(
l1.begin(),
l1.end(),
l2.begin(),
l2.end(),
v.begin()
);

Однако v возвращается как пустой список. Это потому, что я не могу использовать его в контейнере списка?

8

Решение

Это потому что v.begin() это начало пустой последовательности. Элементы копируются практически везде. Замени это std::back_inserter(v), Это даст вам итератор, который знает, как вставить в v,

11

Другие решения

Вы должны предоставить выходной итератор, который будет вставить. Попробуйте использовать std::inserter.

std::list<int> a {
10, 10, 10, 11, 11, 11, 12, 12, 12, 13
};
std::list<int> b {
10
};
std::list<int> diff;
std::set_difference(a.begin(), a.end(), b.begin(), b.end(),
std::inserter(diff, diff.begin()));
6

По вопросам рекламы [email protected]