c++中两组结构体的并集

Union of two sets of structs in C++

本文关键字:结构体 两组 c++      更新时间:2023-10-16

我有SplinePoints和InterpolatedPoints的集合。它们的联合必须存储在FinalInterpolatedPoints中。

这是主文件:

#include <iostream>
#include <vector>
#include <conio.h>
#include <cmath>
#include <algorithm>
#include <iterator>
#include <set>
using namespace std;
typedef struct SplinePoints {
int x;
double y;
SplinePoints(int a, double b) : x(a), y(b) {
}
friend bool operator < (SplinePoints const&A, SplinePoints const&B) {
    return A.x < B.x;
}
};
typedef struct InterpolatedPoints {
int x;
double y;
InterpolatedPoints(int a, double b) : x(a), y(b) {
}
friend bool operator < (InterpolatedPoints const&A, 
                InterpolatedPoints const&B) {
    return A.x < B.x;
}
};
typedef struct FinalInterpolatedPoints {
int x;
double y;
FinalInterpolatedPoints(int a, double b) : x(a), y(b) {
}
friend bool operator < (FinalInterpolatedPoints const&A, 
                FinalInterpolatedPoints const&B) {
    return A.x < B.x;
}
FinalInterpolatedPoints operator= (SplinePoints const&A) {
    x = A.x;
    y = A.y;
    return *this;
}
FinalInterpolatedPoints operator= (InterpolatedPoints const&A) {
    x = A.x;
    y = A.y;
    return *this;
}
};
inline bool operator < (InterpolatedPoints const&A, 
                SplinePoints const&B) {
return A.x < B.x;
}
int main (int argc, char** argv) {
set <SplinePoints> set1;
set <InterpolatedPoints> set2;
set <FinalInterpolatedPoints> BaseLine;
set1.insert(SplinePoints(1,2));
set1.insert(SplinePoints(2,5));
set1.insert(SplinePoints(3,8));
set1.insert(SplinePoints(4,1.66));
set2.insert(InterpolatedPoints(5,5.768));
set2.insert(InterpolatedPoints(6,5.560));
set2.insert(InterpolatedPoints(7,5.643));
set2.insert(InterpolatedPoints(8,5.313));
set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(BaseLine, BaseLine.begin()));
getch();
return 0;
}

我使用这个函数来做:

set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(BaseLine, BaseLine.begin()));

其中set1、set2和BaseLine的类型分别为SplinePoints、InterpolatedPoints和FinalInterpolatedPoints。

当我调试程序时,我得到<和'='操作符的模板重载错误,这些操作符被引用到头文件alogrithm的源文件

template<class _InIt1,
class _InIt2,
class _OutIt> inline
_OutIt _Set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
{   // OR sets [_First1, _Last1) and [_First2, _Last2), using operator<
for (; _First1 != _Last1 && _First2 != _Last2; )
    **if (_DEBUG_LT(*_First1, *_First2))**
        {   // copy first
        ***_Dest++ = *_First1;**
        ++_First1;
        }
    **else if (*_First2 < *_First1)**
        {   // copy second
        ***_Dest++ = *_First2;**
        ++_First2;
        }
    else
        {   // advance both
        ***_Dest++ = *_First1;**
        ++_First1;
        ++_First2;
        }
_Dest = _STD copy(_First1, _Last1, _Dest);
return (_STD copy(_First2, _Last2, _Dest));
}

我在结构定义中包含了操作符重载函数,但我只能摆脱与<函数相关的错误。我仍然难以删除与=相关的错误,即:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const SplinePoints' (or there is no acceptable conversion)

请帮忙!

尝试:

FinalInterpolatedPoints operator= (const SplinePoints &A)

即,将const关键字移动到类型(SplinePoints)之前。

您的代码有些地方很奇怪。把typedef放到类的前面:

/*drop: typedef*/ struct SplinePoints {

,而且,你的operator=应该返回一个引用,例如,

FinalInterpolatedPoints& operator= (SplinePoints const&A) {
//                     ^ add this!
    x = A.x;
    y = A.y;
    return *this;
}

除此之外,您还没有提供一个可编译的完整示例。如果您在修复上述问题后仍有问题,请创建一个并编辑问题。