二进制'=':未找到采用'const Thing'

时间:2019-03-09 11:54:18

标签: c++ vector set std-pair set-difference

我读过重复的书,但确实对我没有帮助。

我正在尝试达到下一个行为。 由对{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操作有多错误以及我不能直接分配“事物”有关。因此,set_difference无法检查它们是否相同。因为错误是

  

二进制'=':未找到采用左操作数类型的运算符   '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。

1 个答案:

答案 0 :(得分:1)

set_difference将结果写入第5个参数所指向的位置。您传递的是differenceResult.begin()错了,因为begin的{​​{1}}总是返回 const iterator 。您不能在目标是const迭代器指向的对象的地方执行写操作。

如果由于set算法而将Thing个对象存储到set中,则可以使用set_difference

std::inserter

然后您可以将 set<Thing> res; // CREATE EMPTY SET set_difference(differenceResult.begin(), differenceResult.end(), pairWithSet[i].second.begin(), pairWithSet[i].second.end(), std::inserter(res,res.begin())); // CREATE INSERT_ITERATOR WHICH INSERTS THINGS INTO RES 复制到res