C++ 寻找合适的数据结构

C++ 寻找合适的数据结构,c++,c,C++,C,我有以下格式的数据: 1-> (2,3),(4,5),(6,7),(8,2) //up to 10000 values 9-> (4,5),(7,90),(8,1),(9,10) //up to 1000000 values 11-> (9,10),(11,2),(12,1) ... 我想要一个适合于从两个键(行和列)快速查找值的数据结构,因此find(9,7)应该给出上面示例中的90 请注意,值序列已经排序,我对查找时间比对插入时间更感兴

我有以下格式的数据:

  1->  (2,3),(4,5),(6,7),(8,2)      //up to 10000 values
  9->  (4,5),(7,90),(8,1),(9,10)    //up to 1000000 values
  11-> (9,10),(11,2),(12,1)
  ...
我想要一个适合于从两个键(行和列)快速查找值的数据结构,因此
find(9,7)
应该给出上面示例中的
90


请注意,值序列已经排序,我对查找时间比对插入时间更感兴趣。

我不确定我是否理解这个问题,但是

map<int, vector<pair<int, int>>
map我推荐

map<int, set<pair<int, int> > >
map
std::set
是一个已排序的容器

请注意,您必须使用比较函数(
operator声明集合您可以使用的容器有:

  • std::map
    提供对数时间查找
  • std::无序映射
    ,它提供恒定的时间查找
  • sorted
    std::vector
    ,它提供对数时间查找。它比前两个占用更少的空间,但构建速度较慢,查找代码更复杂
最简单的满足您需求的方法是:

std::unordered_map<int, std::unordered_map<int,int> >
std::无序映射
请注意,这会丢弃一些信息,因为值类型不再排序……但查找行为应该仍然良好

如果出于某种原因(请在声称这是为了速度之前进行基准测试),您可以使用

std::unordered_map<int, std::vector<std::pair<int,int> > >
std::无序映射

使用标准库提供的二进制搜索算法(例如:代码> STD::LoWiReLoad )。< /P>这是C还是C++?你反对的东西(<代码> MAP>代码>)是它不利用第一元素中的顺序,对吗?“β-是的,你是正确的:”我问你正在做什么“更有效”。你想节省空间吗?你想节省时间吗?如果是这样,您希望加快速度的做法是什么?你根本没有暗示你想要改进什么特性。@YuchenZhong对我来说,效率意味着更快的检索速度。我真的不在乎插入:)非常感谢:)但我的问题是..我有地图的第一个元素按顺序排列,我根本没有利用这个事实..如我的示例所示。。(1、9、11、、都已排序)。有没有一种方法可以让代码通过利用这些信息变得更高效?你必须告诉我们你的代码在做什么,我们才能告诉你它是否可以更高效。你想节省时间吗?空间做什么?没用,我想节省时间。我真的不在乎空间你问过压缩,压缩通常以时间为代价节省空间。例外情况是,它可以帮助您将更多的数据放入每个缓存线,或者减少您在慢速总线上所需的数据量。这仍然是存储数据的最佳方式。如果要按键检索元素,请在向量上使用

std::binary\u search
,以便高效检索。你不需要一个特殊的数据结构来保存这些对。我已经有了排序格式的数据。现在它会有所不同吗?现在它会恶化每个对在值中的位置,但是因为你还没有说你需要对值做什么,很难说它是否有其他改进。@AliceEverett:它允许快速插入和搜索,因为它利用了元素被排序的事实。@Beta抱歉,我真的不知道它是如何做到的。你能不能再详细解释一下……对不起,我在这方面是个新手things@AliceEverett:如何设置它?它执行二进制搜索进行搜索,并执行合并算法进行插入。我不知道如何更详细地解释它,因为我不知道你已经知道多少。你熟悉“大O”符号吗?合并排序?二进制搜索?