我正在尝试使用std::set_intersection在具有共同绑定“名称”字段的两种完全不同类型的数据结构之间查找共同元素。
我在这里查看了以下输入链接描述,但它似乎迫使我在我试图避免的 2 种不同结构类型之间进行自定义转换(因为这些类型来自第 3 方)
下面的代码片段显示了我想要实现的目标。
// common field used for set intersection
typedef struct StructA {
std::string mCommonField;
float mFloatValue;
} StructA;
typedef struct StructB {
std::string mCommonField;
int mValue1;
short mValue2;
} StructB;
// initially unsorted list
std::vector<StructA> aStructs = {{"hello", 1.0f}, {"goodbye", 2.0f}, {"foo", 3.0f}};
// initially unsorted list
std::vector<StructB> bStructs = {{"hello", 1, 2}, {"goodbye", 3, 4}, {"bar", 5, 6}};
// sorting both sets before calling std::intersection
std::sort(aStructs.begin(), aStructs.end(),
[](const StructA& lhs, const StructA& rhs) {
return lhs.mCommonField < rhs.mCommonField;
});
std::sort(bStructs.begin(), bStructs.end(),
[](const StructB& lhs, const StructB& rhs) {
return lhs.mCommonField < rhs.mCommonField;
});
std::vector<StructA> intersection;
std::set_intersection(
aStructs.begin(), aStructs.end(),
bStructs.begin(), bStructs.end(),
std::back_inserter(intersection),
[](const StructA& lhs, const StructB& rhs){
return lhs.mCommonField < rhs.mCommonField;
});
我正在使用 Visual Studio 2013 来编译上面的代码,但是上面的代码会吐出大量错误,如下所示。通读std::set_intersection我在将兼容的StrictWeakOrdering comp最后一个参数放在一起时遇到问题。理想情况下,我希望将其实现为一次性 lambda。
template <class InputIterator1, class InputIterator2, class OutputIterator,
class StrictWeakOrdering>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result,
StrictWeakOrdering comp);
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3591): 错误 C2664: 'bool (__vectorcall *)(const main::StructA &,const main::StructB &)' : 无法将参数 1 从 'main::StructB' 转换为 'const main::StructA &' 1>
原因:无法从 'main::StructB' 转换为 'const main::StructA' 1> 没有用户定义的转换可以执行此转换的可用运算符,或者无法调用该运算符 1>
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3625) :请参阅对函数模板实例化的参考 '_OutIt std:: _Set_intersection<_InIt1,_InIt2,_OutIt,_Pr>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,_Pr)' 正在编译 1> 与 1> [ 1>
_OutIt=std::back_insert_iterator>> 1> , _InIt1=main::StructA * 1> ,
_InIt2=main::StructB * 1> , _Pr=main:: 1> ] 1> C:\Program Files (x86)\ Microsoft Visual Studio 12.0\VC\include\algorithm(3654) :请参阅正在编译的函数模板实例化 '_OutIt std::_Set_intersection2(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,_Pr,std::true_type)' 的参考 1> 1> [ 1>
_OutIt=std::back_insert_iterator>> 1> , _Pr=main:: 1> , _InIt1=main::StructA * 1> ,
_InIt2=main::StructB * 1> ] 1> ....\src\dlf\main.cpp(111) : 参见函数模板实例化 '_OutIt std::set_intersection>>,std::_Vector_iterator>>, std::back_insert_iterator>>,main::>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,_Pr)' 正在编译 1> 与 1> [ 1>
_OutIt=std::back_insert_iterator>> 1> , _Ty=main: :StructA 1> ,
_InIt1=std::_Vector_iterator>> 1> ,
_InIt2=std::_Vector_iterator>> 1> , _Pr=main:: 1> ]
我还尝试使用自定义比较器结构进行比较,但错误更加令人困惑:
struct comparator {
bool operator()(const StructA& lhs, const StructB& rhs) const {
return lhs.mCommonField < rhs.mCommonField;
}
bool operator()(const StructB& lhs, const StructA& rhs) const {
return lhs.mCommonField < rhs.mCommonField;
}
};
std::vector<StructA> intersection;
std::set_intersection(
aStructs.begin(), aStructs.end(),
bStructs.begin(), bStructs.end(),
std::back_inserter(intersection),
comparator());
这导致以下详细错误输出。我希望避免自定义结构(因为我尝试使用的实际结构来自第 3 方)以将转换器从 StructA 转换为 StructB,反之亦然,有什么办法可以避免这种情况,只需要一些简单的 lambda实现两个相对简单的结构与一个公共字段之间的简单绑定?
提前致谢。
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(521): 错误 C2664: 'bool main::comparator::operator ()(const main::StructA &,const main: :StructB &) const' : 无法将参数 1 从 'main::StructA' 转换为 'const main::StructB &' 1> 原因:无法从 'main::StructA' 转换为 'const main::StructB' 1>没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(625) :请参阅函数模板的参考实例化 'bool std::_Debug_lt_pred<_Pr,main::StructA&,main::StructA&>(_Pr,_Ty1,_Ty2,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 和 1>[1>
_Pr=main::comparator 1> , _Ty1=main::StructA & 1> , _Ty2=main::StructA & 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility (636) : 请参阅对函数模板实例化 'void std::_Debug_order2<_InIt,_Pr>(_FwdIt,_FwdIt,_Pr,std::_Dbfile_t,std::_Dbline_t,std::forward_iterator_tag)' 的引用 1> 与 1 > [ 1>
_InIt=std::_Vector_iterator>> 1> , _Pr=main::comparator 1> ,
_FwdIt=std::_Vector_iterator>> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3649) :参见函数模板实例化的参考 'void std::_Debug_order<_InIt1 ,_Pr>(_InIt,_InIt,_Pr,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 1> [ 1>
_InIt1=std::_Vector_iterator>> 1> , _Pr=main::comparator 1> ,
_InIt=std::_Vector_iterator>> 1> ] 1> ....\src\dlf\main.cpp(118) : 参见函数模板实例化 '_OutIt std::set_intersection>>,std::_Vector_iterator> >,std::back_insert_iterator>>,main::comparator>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,_Pr)' 正在编译 1> 和 1>[1>
_OutIt=std::back_insert_iterator>> 1> , _Ty=main::StructA 1> ,
_InIt1=std::_Vector_iterator>> 1> ,
_InIt2=std::_Vector_iterator>> 1> , _Pr=main::comparator 1> ] 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(523): error C2664: 'bool main::comparator::operator ()(const main::StructA &,const main::StructB &) const' : 无法将参数 1 从 'main::StructA' 转换为 'const main::StructB &' 1> 原因: 无法从 'main::StructA' 转换为 'const main::StructB' 1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1>C:\Program Files (x86) \Microsoft Visual Studio 12.0\VC\include\xutility(521): 错误 C2664: 'bool main::comparator::operator ()(const main::StructA &,const main::StructB &) const':无法将参数 2 从 'main::StructB' 转换为 'const main::StructA &' 1> 原因:无法从 'main::StructB' 转换为 'const main::StructA' 1> 没有用户定义的转换运算符可以执行此转换的可用,或者无法调用运算符 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(625) :请参阅对函数模板实例化的参考 'bool std::_Debug_lt_pred <_Pr,main::StructB&,main::StructB&>(_Pr,_Ty1,_Ty2,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 和 1> [ 1>没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(625) :请参阅函数模板的参考实例化 'bool std::_Debug_lt_pred<_Pr,main::StructB&,main::StructB&>(_Pr,_Ty1,_Ty2,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 和 1> [ 1>没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(625) :请参阅函数模板的参考实例化 'bool std::_Debug_lt_pred<_Pr,main::StructB&,main::StructB&>(_Pr,_Ty1,_Ty2,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 和 1> [ 1>_Dbline_t)' 正在编译 1> 与 1> [ 1>_Dbline_t)' 正在编译 1> 与 1> [ 1>
_Pr=main::comparator 1> , _Ty1=main::StructB & 1> , _Ty2=main::StructB & 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility (636) : 请参阅对函数模板实例化 'void std::_Debug_order2<_InIt,_Pr>(_FwdIt,_FwdIt,_Pr,std::_Dbfile_t,std::_Dbline_t,std::forward_iterator_tag)' 的引用 1> 与 1 > [ 1>
_InIt=std::_Vector_iterator>> 1> , _Pr=main::comparator 1> ,
_FwdIt=std::_Vector_iterator>> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3650) :参见函数模板实例化参考 'void std::_Debug_order<_InIt2 ,_Pr>(_InIt,_InIt,_Pr,std::_Dbfile_t,std::_Dbline_t)' 正在编译 1> 1> [ 1>
_InIt2=std::_Vector_iterator>> 1> , _Pr=main::comparator 1> ,
_InIt=std::_Vector_iterator>> 1> ] 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xutility(523): error C2664: 'bool main::comparator::operator () (const main::StructA &,const main::StructB &) const' : 无法将参数 2 从 'main::StructB' 转换为 'const main::StructA &' 1> 原因:无法从 'main::StructB 转换' to 'const main::StructA' 1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符