假设我们有一个map
具有较大对象和索引值的对象。索引值也是较大对象的一部分。
我想知道的是,是否有可能更换map
了set
,提取的指标值。
创建一个set
在函子上排序的a相当容易,方法是通过提取索引值来比较两个较大的对象。
set
我认为这是按索引值进行搜索的,默认情况下,a不支持。
我当时在考虑使用std::find_if
,但我相信它会线性搜索,而忽略了我们已经设置的事实。
然后,我想到了使用std::binary_search
函子来比较较大的对象和值,但是我认为它在这种情况下不起作用,因为它不会利用结构,并且会使用遍历,因为它没有随机性访问迭代器。这样对吗?还是有可以正确处理on上此调用的重载set
?
然后我终于想到要使用a boost::containter::flat_set
,因为它具有基础向量,因此大概应该可以与之配合使用std::binary_search
?
但是,也许有一种更简单的方法来做到这一点?
在您回答问题之前,只需使用应使用地图的地图-实际上,我使用的是手动排序的向量(好std::lower_bound
),并正在考虑将其替换为boost::containter::flat_set
,但是这样做似乎并不容易,所以我可能会坚持使用向量。
C ++ 14将引入通过键进行查找的功能,该键不需要构造整个存储的对象。可以如下使用:
#include <set>
#include <iostream>
struct StringRef {
StringRef(const std::string& s):x(&s[0]) { }
StringRef(const char *s):x(s) { std::cout << "works: " << s << std::endl; }
const char *x;
};
struct Object {
long long data;
std::size_t index;
};
struct ObjectIndexer {
ObjectIndexer(Object const& o) : index(o.index) {}
ObjectIndexer(std::size_t index) : index(index) {}
std::size_t index;
};
struct ObjComp {
bool operator()(ObjectIndexer a, ObjectIndexer b) const {
return a.index < b.index;
}
typedef void is_transparent; //Allows the comparison with non-Object types.
};
int main() {
std::set<Object, ObjComp> stuff;
stuff.insert(Object{135, 1});
std::cout << stuff.find(ObjectIndexer(1))->data << "\n";
}
更一般而言,可以使用Boost.MultiIndex解决具有多种方式为数据建立索引的这类问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句