我正在使用set_union(包含在algorithm.cpp中)并在STL库中设置。
我的集合保存了一个自定义类Vertex的对象,我在其中重载了operator =
这是Vertex类:
class Vertex {
public:
City city;
bool wasVisited;
Vertex() {};
Vertex(City c) {city = c; wasVisited = false;}
double getWeightToVertex(Vertex v) {return city.getWeightWith(v.city);}
Vertex& operator=(const Vertex&v) {
if(this == &v)
return *this;
city = v.city;
return *this;
}
};
问题在于以下几行,包含在另一个类的方法中。
for(int i=0; i<nEdges; i++) {
Edge e = edges[i];
Vertex start = vertexList[e.start];
Vertex end = vertexList[e.end];
if(sets[e.start].find(vertexList[e.end]) == sets[e.start].end()) { // The two vertices do not belong to the same set
//Add the edge to our MST
MST[nValidEdges] = e;
nValidEdges++;
//Get the union of vertex sets and insert it
//in the corresponding place in the dynamic array
set<Vertex> unionSet;
set_union(sets[e.start].begin(), sets[e.start].end(), sets[e.end].begin(), sets[e.end].end(), unionSet.begin());
sets[e.start] = unionSet;
}
}
该代码在algorithm.cpp中生成编译错误,更具体地说是在set_union的代码中,它声明对于两个“InputIterator”类型的对象没有可行的重载operator =。
这是编译器错误位置:
template <class _InputIterator, class _OutputIterator>
inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
for (; __first != __last; ++__first, ++__result)
*__result = *__first; //Error Here: No Viable Overloaded '='
return __result;
}
我在这里缺少什么?
答案 0 :(得分:2)
除了完全错误的Vertex::operator=
(可以删除)之外,您的错误原因是您需要将unionSet包装在插入器中。
set_union(sets[e.start].begin(),
sets[e.start].end(),
sets[e.end].begin(),
sets[e.end].end(),
inserter(unionSet, unionSet.begin()));
像set_union
这样的函数在'覆盖'模式下过度运行,即它们会覆盖您正在写入的容器的现有元素。如果要将元素添加到空容器,则必须使用类似插入器的适配器。