STL 设置::查找重新定义的搜索
STL set::find redefined search
我的程序基于一组对,即
typedef std::pair<int,int> innerPair;
typedef std::pair<innerPair,int> setElement;
std::set<setElement> Foo;
innerPair
元素是真正定义setElement的元素,但我需要为每个元素附加一个组ID,因此后者setElement
定义。
在程序的其余部分,我需要找到innerPair
,无论他们的组ID如何,所以我基本上需要一个函数
std::set<setElement>::iterator find(innePair);
这将找到内部对,而不考虑其组 ID。就目前而言,我可以简单地循环浏览所有可用的组 ID 并执行多个 find() 调用,但它远非高效。
是否有一种简洁的方法可以定义执行某种通配符搜索的 find( ... )
成员函数,或者我是否需要用我自己的定义重载它?
如果您有多个具有相同内部对和不同组 id 的元素,则可以使用 std::multimap<innerPair, int>
.
这允许您存储具有相同innerPair
的多个元素。
它还简化了使用lower_bound/upper_bound
或equal_range
进行搜索。
我看到了两种可能的设计。一个可能比另一个更适用。
innerPair
可能更适合是具有 3 个成员(第一个、第二个和组 ID)的结构或一个std::tuple<int, int, int>
。组 ID 是innerPair
对象的一部分吗?如果是这样,那么我建议这是更好的设计。
如果不是(老实说,我认为在您的情况下并非如此),您应该使用std::map<innerPair,int>
来创建从innerPair
对象到组 ID 的映射。然后,您可以使用以下方法轻松找到元素:
std::map<innerPair,int> mapping;
// Fill your map
innerPair key = {1, 2};
auto found_iter = mapping.find(key);
您还可以通过以下方式获取特定innerPair
的组 ID:
int group_id = mapping[key];
您无需提供自定义比较器,因为operator<
已为 std::pair
定义了比较器。
如果你想按部分对象搜索,你最好不要使用std::set<...>
,而是一个std::map<...>
:
std::map<std::pair<int, int>, int>
无论如何,这几乎具有您为std::set<...>
定位的值类型(不同之处在于first
成员声明为 const
)。
如果你真的坚持使用std::set<...>
你需要创建一个忽略最后一个second
成员的比较器类型。我不确定std::set<...>
是否支持混合类型比较(我认为它不支持)。
带有自定义比较函数或函子的multiset
,例如:
struct innerPairCompare
{
bool operator () (const setElement &a, const setElement &b)
{
const innerPair &a_ = a.first;
const innerPair &b_ = b.first;
return (a_.first > b_.first || a_.first = b_.first && a_.second > b_.second);
}
};
然后将其用于您的multiset
:
std::multiset<setElement,innerPairCompare> Foo;
它将在同一列表中存储具有相同innerPair
的所有setElement
。
或者,如果您需要给定GroupID
的所有innerPair
,请使用在 groupID 上比较的函数。
最后,如果您真的不需要将GroupID
和innerPair
放在一起,则可以使用map
(或multimap
),使用GroupID
或innerPair
作为Key
。
继续使用std::set
那么你可以将std::find_if
与自定义谓词一起使用,看看这个答案。
基本上你会定义一个函数
bool pairCorresponds(std::pair<int,int> element)
这将为您完成工作。
- 错误 C2676;在C++的二叉搜索树类中定义 ++ 运算符时遇到问题
- 即使定义了搜索路径,也找不到自定义共享库
- STL 设置::查找重新定义的搜索
- 对函数的未定义引用(在二进制搜索树中)C++
- 矢量中的自定义二叉搜索
- openMP 在自定义容器中从 2 到 4 个线程执行二进制搜索时速度变慢
- 使用std::find()搜索用户定义结构的向量
- 如何在搜索中不使用std::map的自定义比较函数(map::find)
- = 未为 std 定义::使用 const 字符串时搜索
- 如何搜索没有名称的函数的定义
- 定义lambda以搜索指向自定义类型的指针向量
- 为OS X搜索可以使用自定义gcc安装的C/ c++ IDE
- 在C++中定义和搜索相关订单上的集合
- 使用gcc或cpp搜索定义的位置
- 使用二叉搜索树定义运算符 == 和运算符>时出错
- 在Makefile中自定义库搜索路径
- 基于元素的自定义键搜索向量
- 二叉搜索树类 - 标识符"ItemType"未定义
- 如何为自定义文件格式构建筛选器处理程序,以便可以通过windows搜索来搜索其内容
- 转到原始解决方案中复制的解决方案中的定义搜索