在包含自定义类型的集合中查找
Find in a set containing self defined type
我有一个存储自定义数据的集合,我想按键值搜索它。
下面是一个简单的例子:
struct Data {
Data(int x, int y):x(x), y(y){}
int x;
int y;
};
struct Compare {
bool operator() (const Data& lhs, const Data& rhs) {
return lhs.x < rhs.x;
}
};
int main()
{
set<Data, Compare> s;
s.insert(Data(2, 77));
s.insert(Data(3, 15));
s.insert(Data(1, 36));
for (auto i:s)
cout<<i.x<<" "<<i.y<<endl;
auto i = s.find(3); // <-- Not working
auto i = s.find(Node(3, 0));
if (i != s.end())
cout<<"found"<<endl;
else
cout<<"not found"<<endl;
}
这个集合只按x
排序,但是我必须创建一个临时对象来搜索这个集合:s.find(Node(3, 0))
可以只按键搜索吗?即s.find(3)
?
在c++14中,您可以使用is_transparent
:
查找一个键值与值x相等的元素。此重载仅在重载解析中参与qualified-id
Compare::is_transparent
是有效的,并且表示一个类型。它允许在不构造Key
实例的情况下调用此函数
struct Compare {
using is_transparent = std::true_type;
bool operator() (const Data& lhs, const Data& rhs) const {
return lhs.x < rhs.x;
}
bool operator() (const Data& lhs, const int & rhsx) const {
return lhs.x < rhsx;
}
bool operator() (const int & lhsx, const Data& rhs) const {
return lhsx < rhs.x;
}
};
你为什么不写这样的东西呢?
Data myFind(const set<Data, Compare>& s, int x) {
auto it = s.find(Node(x, 0));
return *it;
}
您的代码有错误。std::set
是一个唯一的容器,这意味着它不希望包含两个彼此相等的值。然而,通过给这个集合一个只使用x
的比较函数,你已经使得具有相同x分量的两个值被这个集合认为是相等的,不管它们的y是否匹配。这将防止您为x插入多个值(这可能是您想要的…如果是,忽略这一部分。)更好的比较方法是通过查看y来打破x中的联系(这被称为"字典式"比较:
struct Compare {
bool operator() (const Data& lhs, const Data& rhs) {
if(lhs.x != rhs.x) return lhs.x < rhs.x;
return lhs.y < rhs.y;
}
};
现在,对于通过与键不具有相同类型的东西进行搜索。这在c++ 14中成为可能,因为关联容器的搜索函数中出现了一些新的重载。有关更多信息,请参阅关于unique_ptrs集合的原始指针查找的第一个答案。基本上,您为比较器提供了一个"is_transparent"成员来标记它,并使它能够将Data
与您打算搜索的任何类型进行比较。
相关文章:
- Python 集合.计数器,如何避免重复查找
- 如何查找集合的所有分区 (C++)
- 如何在集合中的特定字符串中查找子字符串
- 在集合中查找使用结构C++的元素
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 在具有自定义对象的集合中查找值
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 使用STL算法查找集合中的所有匹配项
- 在集合中查找结构向量
- 使用 STL 算法查找集合中的前两个不相邻元素
- 如何查找数组集合中第二大元素的索引
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 查找集合中第k个最大元素
- [唯一相等运算符]在集合中查找重复元素并将其分组的快速算法是什么
- C++模糊解算器:在集合中查找前缀
- 更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
- 查找两个集合之间的邻近匹配对
- 在包含自定义类型的集合中查找
- 在任意加长的集合中查找最大数不起作用
- 在结构体集合中查找项