set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(s3, s3.begin()));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Пример: http://ideone.com/B4Cc1
Если в качестве выходного итератора указать s3.begin()
, вы захотите перезаписать переднюю область набора с помощью набораразница.Перезапись требует, чтобы размер набора был больше, чем результат, что, очевидно, не соответствует действительности в большинстве случаев;даже если набор не пустой, вы не можете использовать s3.begin()
в качестве выходных данных, поскольку итератор доступен только для чтения (в противном случае он разрушит отсортированный порядок).
OTOH, std::inserter(x, cit)
означает, что всякий раз, когдаэтот выходной итератор назначен (*it = y
), будет вызван метод вставки (x.insert(cit, y)
), что вам действительно нужно: заполнить набор из пустого.