在 c++ 集中查找相等的实例
Find equal instance in a c++ set
我正在使用 c++ STL 集,我想知道它是否存在于等效实例集中。为了检索实例,我正在使用查找集方法。问题是它不起作用。我认为问题出在我的比较器对象上:
bool SetComparator::operator ()( const Point* i1, const Point* i2 ) const {
if ( *i1 == *i2 )
return false;
return true;
}
运算符 == 以简单的方式为类 Point 重新定义:
bool Point::operator ==( const Point& p ) const {
if (x == p.x && y == p.y)
return true;
return false;
}
调试后,我可以看到 find 方法调用 operator(),但它没有找到相同的实例,因此 find 返回 end(),但我知道有一个相等的对象。我认为问题与设置的内部顺序有关。我该怎么办?
std::set 使用部分排序(即 operator<
),所以当你传入一个只能决定相等的运算符时,你就打破了 std::set 实现的假设。您的 SetComparator 必须表现得与 std::less
类似。
例如 std::p air(实用程序)为两个项目实现关系运算符,例如 operator<
:
template <class T1, class T2>
bool operator< (const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs) {
return lhs.first<rhs.first || (!(rhs.first<lhs.first) && lhs.second<rhs.second);
}
请注意,(!(rhs.first<lhs.first) && lhs.second<rhs.second)
是仅使用operator<
的(rhs.first == lhs.first && lhs.second < rhs.second)
解决方法
如果你只想检查相等性,也许使用 std::set 是错误的决定。如果可以对对象进行哈希处理,则可以使用 std::unordered_set(C++11 及更高版本)。
相关文章:
- 从C++实例化QML
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 从模板实例化/类型推断中查找错误消息的实际来源
- 如何在源代码C++查找类的实例化
- 重载函数查找轮廓的实例与参数列表不匹配
- 查找数组中的实例
- 使用正则表达式查找多个字符串的第一个实例
- C++ 没有与参数列表匹配的重载函数"sqrt"实例 - 试图查找结构类型的数字数组是否为完美平方
- C++查找实例化的模板
- 在 c++ 集中查找相等的实例
- 在模板实例化中查找从属名称C++
- 'make_error_code' 未在此范围内声明,并且在实例化点通过依赖于参数的查找未找到任何声明
- 如何查找给定的应用程序是否为单个实例
- 指向基类型的指针的矢量,查找存储在基类型中的给定派生类型的所有实例
- 搜索数组以查找单词的单独实例
- C++:在超类向量中查找类的实例
- 在c++代码中查找未实例化的模板
- 错误:nth_element-没有重载函数实例(中位数查找程序)