C :带有两个相关密钥的快速结构
C++: Fast structure with two related keys
我有一个需要容纳ID(ID是唯一的)和数据值的容器。我还需要按顺序保留这些ID。这些变量的元组将通过ID查找,但然后以直至找到的元素进行处理,即我并不总是想处理整个容器。为此,我有一个简单的解决方案
// ordinal, { ID, data }
std::map<int64, pair<int64, data_t> >
我将首先通过迭代并将搜索值与该对的第一个字段进行比较来搜索ID,从而为我提供一个迭代器,然后将所有元素处理到该位置。有没有更好的方法来执行此操作(用我的计数为o(2n))?
您可以交换ordinal
和ID
并将它们存储在地图中:
// ID ordinal data
std::unordered_map<int64, std::map<int64, data_t>> container;
这将允许您在O(log N)
时间内找到带有ID
的元素,并最小可能的ordinal
:
container[ID].begin(); // Has ID given, smallest possible ordinal and corresponding data
// Equal to container[ID].end() if not found
之后,您可以将发现的对象的ordinal
与给定的阈值进行比较。
up:当然,如果您的ID
S是唯一的,则嵌套的map
中没有必要:您只需使用std::unordered_map<int64, std::pair<int64, data_t>>
。
如果要索引值和键,则可以使用boost.bimap。这样,您可以根据其值在地图中查找一对。没有这个或类似的情况,必须通过蛮力来完成(=>迭代地图上的地图)。
否则,您可以使用std :: find_if来帮助您找到与您要寻找的ID的对,但它的速度与在地图上迭代的速度相同。
如果序数严格用于维护订单,并且不会有任何差距,我会做一些简单的事情:
int64_t givenID = whereToQuit;
std::vector< int64_t > ordinal_to_ID;
std::unordered_map< int64_t, data_t > data_map;
using datapair_t = std::pair< int64_t, data_t >;
void do_whatever( datapair_t );
bool done = false;
do
{
int64_t ID = ordinal_to_ID[ i ];
do_whatever( datapair_t( ID, data_map[ ID ]) );
done = ID == givenID;
}
while ( !done );
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 如何在STD :: MAP中找到具有至少一个数据成员等于密钥的结构的元素
- C :带有两个相关密钥的快速结构
- Zobrist密钥的高效数据结构