Не передавая ваш код, мы можем только догадываться, что ваш код делает неправильно.
Вот что я сделал. Я обернул разницу логики c в помощник operator-
. Я использовал std::unordered_set
намеренно, потому что они не могут быть использованы непосредственно в std::set_difference
.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <unordered_set>
#include <vector>
using std::cout;
using std::inserter;
using std::ostream;
using std::set_difference;
using std::sort;
using std::string;
using std::unordered_set;
using std::vector;
namespace {
unordered_set<string> operator-(unordered_set<string> const& minuend, unordered_set<string> const& subtrahend) {
vector<string> m(minuend.begin(), minuend.end());
vector<string> s(subtrahend.begin(), subtrahend.end());
sort(m.begin(), m.end());
sort(s.begin(), s.end());
unordered_set<string> diff;
set_difference(m.begin(), m.end(), s.begin(), s.end(), inserter(diff, diff.begin()));
return diff;
}
ostream& operator<<(ostream& out, unordered_set<string> const& container) {
char const* sep = " ";
out << "{";
for (auto const& s : container) {
out << sep << "\"" << s << "\"";
sep = ", ";
}
out << " }";
return out;
}
}
int main() {
auto a = unordered_set<string>{ "car", "boat", "table", "ball" };
auto b = unordered_set<string>{ "car", "goat", "helicopter" };
auto c = unordered_set<string>{ "square", "car", "goat", "boat" };
auto d = a - b - c;
cout << d << "\n";
}
ОБНОВЛЕНИЕ , отвечая на вопросы Фаэнора
Почему вы используете std :: unordered_set (вместо std :: set)?
Я выбрал unordered_set, чтобы продемонстрировать, что для set_difference требуется отсортированный контейнер. В unordered_set отсутствует эта функция.
А оригинальный постер в исходном неотредактированном вопросе не предоставил подробностей о том, какой тип контейнера использовался.
Почему вы конвертируете это в std :: vector, который нужно будет отсортировать (вместо преобразования в std :: set)?
Вектор - очень эффективный контейнер, так как элементы в нем имеют локальность, и поэтому хороший кеш. Это мой go -контейнер.
Набор имеет гораздо больше выделений памяти, потому что это я sh узлов, и ему не хватает локальности.
Строковый объект в любом случае в содержимом может отсутствовать локальность, поскольку это в основном умный указатель на массив символов. Но из-за небольшой оптимизации строк (SSO), и это небольшие строки, он также не будет выделяться из кучи.
В сценарии исходного плаката в каждом контейнере есть только несколько элементов, таким образом, проблемы эффективности незначительны. Но стоит подумать, если проблемный домен был увеличен.
Я думаю, что вы должны были использовать std :: set (без каких-либо разъяснений со стороны OP) и если пользователь получил std: Вместо этого: unordered_set, он сам должен преобразовать его в правильный std :: set и затем вызвать ваш operator-()
.
Это жизнеспособный вариант. Из-за отсутствия контекста я считал, что это «худший сценарий», поскольку контейнер unordered_set не удовлетворяет требованию алгоритма set_difference.