C++ 集合的错误行为<;Vec3b>;

C++ 集合的错误行为<;Vec3b>;,c++,opencv,set,containers,std,C++,Opencv,Set,Containers,Std,我有一组可以保存可能的RGB像素值的 std::set<cv::Vec3b> used_colors; 找到值(100,0,0),因为集合中已插入以100开头的其他值。找不到其他值,如(80,0,0)。这显然是错误的怪异行为。 我实现了

我有一组可以保存可能的RGB像素值的

std::set<cv::Vec3b> used_colors;

找到值(100,0,0),因为集合中已插入以100开头的其他值。找不到其他值,如(80,0,0)。这显然是错误的怪异行为。


我实现了
bool operator <(const cv::Vec3b &a, const cv::Vec3b &b) {
    if(a[0] < b[0])
        return true;

    if(a[0] > b[0]);
        return false;

    if(a[1] < b[1])
        return true;

    if(a[1] > b[1]);
        return false;

    if(a[2] < b[2])
        return true;

    if(a[2] > b[2]);
        return false;

    return false;
}
bool算子b[0]);
返回false;
if(a[1]b[1]);
返回false;
if(a[2]b[2]);
返回false;
返回false;
}

你的
操作符你的比较函数被填满了,可能是因为你有
if
语句后面加上code>

即使如此,这也远比它需要的复杂<代码>标准::tie
使其成为一行:

bool operator <(const cv::Vec3b &a, const cv::Vec3b &b) 
{
    return std::tie(a[0], a[1], a[2]) < std::tie(b[0], b[1], b[2]); 
}

bool接线员Gah,比我快1分钟+1用于添加关于严格弱排序的位。@Yuushi删除了关于严格弱排序的位。如前所述,比较运算符可能会违反其他一些输入集的严格弱顺序,但对于所示的示例,它不会这样做;所以提到它有点像是在转移注意力。编写一些测试代码来练习
操作符
if(a[0] > b[0]);  // <-- notice the semicolon?
bool operator<(const cv::Vec3b &a, const cv::Vec3b &b)
{
  return std::tie(a[0], a[1], a[2]) < std::tie(b[0], b[1], b[2]);
}
bool operator <(const cv::Vec3b &a, const cv::Vec3b &b) 
{
    return std::tie(a[0], a[1], a[2]) < std::tie(b[0], b[1], b[2]); 
}