C++ 具有一致索引的快速查找数据结构

C++ 具有一致索引的快速查找数据结构,c++,stdvector,unordered-map,C++,Stdvector,Unordered Map,我的数据存储在自定义对象的向量中,在这个特定的软件中,我感兴趣的是那些有趣的。因此,我有一个std::vector有趣存储索引的地方,这样当我调用数据[interest[I]]时,我就得到了第I个感兴趣的数据对象 我需要在这里指定有趣的是一个未排序的索引向量,因此目前没有任何巧妙的技巧可以用于对原始数据中的元素进行排序 现在谈谈问题: 这些数据很有趣,因为它们要么有属性A,B,要么两者都有,我需要将该属性的值(假设它是一个简单的double)存储在另一个向量中,以便快速检索 我不知道该怎么办!属

我的
数据
存储在自定义对象的向量中,在这个特定的软件中,我感兴趣的是那些
有趣的
。因此,我有一个
std::vector有趣存储索引的地方,这样当我调用
数据[interest[I]]
时,我就得到了第I个感兴趣的数据对象

我需要在这里指定
有趣的
是一个未排序的索引向量,因此目前没有任何巧妙的技巧可以用于对原始
数据中的元素进行排序

现在谈谈问题: 这些数据很有趣,因为它们要么有属性
A
B
,要么两者都有,我需要将该属性的值(假设它是一个简单的
double
)存储在另一个向量中,以便快速检索

我不知道该怎么办!属性应使用哪种结构

比如说
data.size()=100
interest.size()=90
(更大,但更容易处理整数),删除“不感兴趣”的数据不是一个选项,因为它们被软件的其他部分使用。 我特别需要能够快速查找,无论是
数据
还是
有趣的
都不会随着软件的运行而改变大小(只有数据值会改变),因此在结构中插入在开始时是一次性的,不会像查找那样影响性能

我想到了两个解决方案:

  • 我可以使用a
    std::unordered_map a
    和类似的B来存储索引属性对,因此我可以使用
    a.at(interest[I])
    来搜索第I个感兴趣的元素的属性
    a
    。 因为插入在这个阶段不会再发生了,所以我可以安全地假设这是O(1)吗?这是我喜欢的方式

  • 我可以分配一个
    std::vector a(data.size())
    存储这些值,只需调用
    A[interest[i]]
    ,就像我处理数据一样;这可以确保快速查找,但我会:

  • 数据的大小增加时,会浪费大量内存。事实上,如果我们假设没有重叠,我会浪费一个组合的
    data.size()
    元素。现在
    A
    B
    只是
    double
    ,但如果在任何时候我需要将它们的类型更改为更大的类型。。。我假设具有O(1)查找的稀疏向量不存在,对吗
  • 这里没有边界检查,上帝禁止我去搜索
    A[3]
    3
    不是一个有趣的索引!我需要插入我自己的检查开销,这可能会使查找不再那么快
简言之:我对属性
a
B
的数据结构感兴趣,这样我就可以访问那些值[这些值仅为
有趣的
数据点定义]并知道它们对应的
数据

有谁能想出解决这个问题的好办法吗?希望我说得够清楚


一位评论员要求提供一个代码示例,我没有工作,因为我还没有弄清楚要使用哪种数据结构,但理想情况下我只想这样做

std::vector<MyObject> data;
// ...
// get data and do stuff
// ...

std::vector<size_t> interesting;
// ...
// initialise interesting as a vector of indexes that refer to the data
// ...

// Now initialize the A property DS
std::vector<double> A ( data.size() ); // <--- this is what I'm questioning about
// maybe I'm better off with std::unordered_map<size_t,double> A ?

// so that (once initialised) I can quickly do
size_t i = 5;
std::cout << "Data point " << data[ interesting[i] ] << 
    " has a property A's value of " << A[ interesting[i] ] << std::endl;
// for evey i I want
std::矢量数据;
// ...
//获取数据并做一些事情
// ...
感兴趣的向量;
// ...
//初始化Interest作为引用数据的索引向量
// ...
//现在初始化A属性DS

std::vector A(data.size());//也许你可以发布一个代码示例来说明你的问题,我不明白。您可能只需要了解
boost::multi_index
。数据向量在初始化阶段后不会更改?那就别再费心于标记了。定义一个
struct interest
,它持有一个指向您感兴趣的数据和值的指针,并使
interest
成为一个
std::vector
@user9400869,这将是一种工作,但有时我需要轻松访问
a
B
的整个向量,而不是
interest
,反之亦然。另外,因为我有多个属性(
A
B
),所以
struct
应该同时包含这两个属性,但这也会浪费内存,因为不是所有感兴趣的
都同时包含这两个属性@MaximEgorushkin我不知道boost::multi_index,这是一篇有趣的文章,但我恐怕这不是我要搜索的内容TD::unordered_映射查找确实是O(1),尽管比向量查找慢得多,因为它需要散列。另一方面,向量查找需要更多内存。所以像往常一样,你有一个交易。您需要速度或低内存命中。但你不能两者兼得。也许你可以发布一个代码示例来说明你的问题,我不明白。您可能只需要了解
boost::multi_index
。数据向量在初始化阶段后不会更改?那就别再费心于标记了。定义一个
struct interest
,它持有一个指向您感兴趣的数据和值的指针,并使
interest
成为一个
std::vector
@user9400869,这将是一种工作,但有时我需要轻松访问
a
B
的整个向量,而不是
interest
,反之亦然。另外,因为我有多个属性(
A
B
),所以
struct
应该同时包含这两个属性,但这也会浪费内存,因为不是所有感兴趣的
都同时包含这两个属性@MaximEgorushkin我不知道boost::multi_index,这是一篇有趣的文章,但我恐怕这不是我要搜索的内容TD::unordered_映射查找确实是O(1),尽管比向量查找慢得多,因为它需要散列。另一方面,向量查找需要更多内存。所以像往常一样,你有一个交易。您需要速度或低内存命中。但你不能两者兼得。