c++ - 如何在 map 中找到上一个和下一个键/值?

标签 c++ stl dictionary vector stdmap

我有一张包含以下数据的 map :

id    prev abundance  thing
1573  -1      0       book
1864  1573    39      beds
2075  1864    41      tray
1760  2075    46      cups

map 是:

map<int id, Abund*> oldMap;
struct Abund
{
int prev;
int abundance;
string thing;
}

我现在需要创建一个新 map ,它应该如下所示:

 id2    prev2 prevAbun next2  nextAbun  thing2
 1573     -1            1864   39        book
 1864   1573     0      2075   41        beds
 2075   1864     39     1760   46        tray
 1760   2075     41                      cups

map 1 的上一行和下一行应该成为 newMap 中的列 到目前为止,我已经创建了一个新 map 和新结构:

struct NewAbund
{
vector<int> prev2;
vector<int> prevAbun;
vector<int> next2;
vector<int> nextAbun;
string thing2;
}
map<int id2, NewAbund*> newMap;

现在我不知道从 oldMap 获取前一行并将其作为值放入 newMap 的逻辑应该如何工作。提前致谢!!

最佳答案

如果您只是遍历 map ,您将获得迭代器,这些迭代器指向按键按顺序配对。因此,如果您在迭代期间记得前一个迭代器,您将有两个连续的迭代器,您可以从中填充新 vector 。

另一方面,由于您总是可以在有序映射中找到下一个和上一个键(尽管它确实需要 O(log n) 时间),所以可能真的没有必要费尽心思去规范化数据。如果您使用的是 c++11,您会发现 std::next 和 std::prev 将使执行这些操作变得非常容易。 (如果不是——为什么不呢?——您可以根据 std::advance 轻松定义它们。)

关于c++ - 如何在 map 中找到上一个和下一个键/值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12739150/

相关文章:

ios - 按键名在字典数组中搜索

c++基本数组从初始化列表初始化

c++ - 函数 __gnu_cxx::__STL_next_prime(usigned long) 有什么作用?

c++ - 您最喜欢用 C/C++ 访问多个不同数据库(MySQL、Oracle...)的跨平台解决方案是什么?

c++ - 如果我按值从函数返回一个 STL 容器,GCC 会单独复制所有元素吗?

c++ - 我可以让 std::list 按顺序插入新元素吗?或者必须使用 std::sort?

python - 将字典压缩成字典的字典

python - 列表分配中的字典导致奇怪的输出

c++ - libstdc++ 对 std::unordered_map 的支持是否不完整?

c++ - 使用用户生成的文件名创建 ifstream?