用std :: set替换std :: map并按索引搜索

曲奇饼

假设我们有一个map具有较大对象和索引值的对象。索引值也是较大对象的一部分。

我想知道的是,是否有可能更换mapset,提取的指标值。

创建一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用std :: set替换std :: map并按索引搜索

来自分类Dev

C ++在std :: map <>中使用std :: set <>

来自分类Dev

C ++在std :: map <>中使用std :: set <>

来自分类Dev

搜索std :: set的最佳方法

来自分类Dev

搜索std :: set的最佳方法

来自分类Dev

按索引循环 std::set

来自分类Dev

用较小的std :: vector替换部分std :: vector

来自分类Dev

用std :: array替换固定大小的数组?

来自分类Dev

用memcopy,memmove或std:copy替换For循环?

来自分类Dev

基于std :: unordered_(set | map)范围擦除的实际用例是什么?

来自分类Dev

C ++ std :: set ::用std :: remove_if擦除

来自分类Dev

使用XCode / Clang用std :: shared_ptr实例化std :: map时出错

来自分类Dev

用std :: array代替[]

来自分类Dev

std :: set和std :: map有什么区别

来自分类Dev

如何从存储在std :: map中的std :: set中删除元素?

来自分类Dev

std :: set和std :: map有什么区别

来自分类Dev

std :: set中索引处的元素?

来自分类Dev

二进制搜索std:map

来自分类Dev

在std :: map中搜索时堆栈溢出

来自分类Dev

二进制搜索std:map

来自分类Dev

std :: map使用键索引遍历键

来自分类Dev

用std :: vector <mutex *>调用std :: lock()

来自分类Dev

用std :: vector <mutex *>调用std :: lock()

来自分类Dev

用std :: generate生成矩阵

来自分类Dev

std :: unordered_set中的KeyEqual是做什么用的?

来自分类Dev

用boost :: assign :: map_list_of填充boost :: function的std :: map

来自分类Dev

std :: find_if,std :: binary_function用于按值搜索std :: map

来自分类Dev

std :: find_if,std :: binary_function用于按值搜索std :: map

来自分类Dev

C++ 在 std::set 的嵌套对中搜索对象

Related 相关文章

热门标签

归档