Я прочитал дубликаты, но на самом деле мне это не помогло.
Я пытаюсь достичь следующего поведения.
Наличие вектора, состоящего из пар {Thing, set < Thing >}
Я хочу конечный результат {Thing, newSetOfThing < Thing >}
где это 'newSetOfThing' - это разница, применяемая с каждым другим
устанавливает в векторе кроме себя. Разница означает наличие всех значений, но содержащихся в других наборах. Я использую std::set_difference
.
Приведу более близкий пример с числами.
vector = {[1, {3,4,5,7}], [2,{1,3,9}], [3, {1,2,12}]};
==>
vectorResult = {[1, {4,5,7}], [2, {9}], [3, {2,12} }
Тогда мой код выглядит так:
class Thing {
public:
Thing () {
};
~Thing () {};
int position; //id
bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Thing) const
{
return(Other.position<position);
}
//The original vector
vector<pair<Thing, set<Thing>>> pairWithSet;
// I fill vector here [...]
// variable I define to store partial results
set<Thing> differenceResult;
// Vector I want to fill for results
vector<pair<Thing, set<Thing>>> newPairWithSet;
// Operation
for (pair<Thing, set<Thing>> currentPair : pairWithSet){
Thing currentThing= currentPair.first;
differenceResult = currentPair.second;
for (int i=0; i<pairWithSet.size();i++) {
if (pairWithSet[i].first.position != currentThing.position) {
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
}
newPairWithSet.push_back(pair<Thing, set<Thing>>(currentThing, differenceResult));
}
Я объясняю мою цель, чтобы у вас была точка, откуда идти, но в конце я думаю, что проблема больше связана с тем, насколько неправильно я использую операцию set_difference и что я не могу напрямую назначить 'Thing'. Поэтому set_difference не может проверить, совпадают ли они. Потому что ошибка
binary '=': не найден оператор, который принимает левый операнд типа
'Const Thing' (или нет приемлемого преобразования
Я говорю, потому что, возможно, существуют другие ошибки для определения поведения, поскольку я все еще не могу отладить, пока не решу проблему с оператором.
У меня вопрос, нужно ли мне объявить эту операцию '=' и как. Или если я что-то пропустил и мне нужно выступить другим способом
Я могу убедиться, что проблема в том, что я использую set_difference. Если я прокомментирую эту часть, компилятор выполнит задачу:
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
И я думаю, это потому, что в конце он пытается выполнить присвоение const (потому что std::pair
объявление?), Так как оно говорит об ошибке (тогда, очевидно, компилятор не знает, как работать). Поэтому я не понимаю, как выполнить это рекурсивно set_difference.