【问题标题】:How do I find previous and next key/value in a map?如何在地图中找到上一个和下一个键/值?
【发布时间】:2012-10-05 03:40:39
【问题描述】:

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

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

地图是:

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

我现在需要创建一个应该如下所示的新地图:

 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 中的列 到目前为止,我已经创建了一个新地图和新结构:

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

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

【问题讨论】:

    标签: c++ stl map vector stdmap


    【解决方案1】:

    如果您只是遍历地图,您将获得指向按键顺序配对的迭代器。因此,如果您在迭代过程中记住了前一个迭代器,您将有两个连续的迭代器,您可以从中填充新的向量。

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

    【讨论】:

    • 哦,我不知道 std::next 和 std::prev 但是当我使用它时,我得到这个错误:'No member named next in namespace std'
    • 您需要 (a) 确保您使用的是 c++11(对于 gcc,它是 --std=c++11 或 --std=c++0x,具体取决于 gcc版本)和(b)#include
    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2015-03-18
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多