C++ 如何在地图中查找上一个和下一个键/值?

C++ 如何在地图中查找上一个和下一个键/值?,c++,stl,map,vector,stdmap,C++,Stl,Map,Vector,Stdmap,我有一张包含以下数据的地图: 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; } 映射

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

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;
}
映射1中的上一行和下一行应成为newMap中的列 到目前为止,我已经创建了一个新地图和新结构:

struct NewAbund
{
vector<int> prev2;
vector<int> prevAbun;
vector<int> next2;
vector<int> nextAbun;
string thing2;
}
map<int id2, NewAbund*> newMap;
struct NewAbund
{
向量prev2;
向量prevAbun;
向量next2;
向量nextAbun;
字符串2;
}
地图新地图;

现在我不知道如何从oldMap中获取前一行并将其作为值放入newMap中。提前谢谢

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


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

哦,我不知道std::next和std::prev,但是当我使用它时,我得到了一个错误:“名称空间std中没有名为next的成员”,你需要(a)确保你使用的是c++11(对于gcc,它是--std=c++11或--std=c++0x,取决于gcc的版本),以及(b)#include
struct NewAbund
{
vector<int> prev2;
vector<int> prevAbun;
vector<int> next2;
vector<int> nextAbun;
string thing2;
}
map<int id2, NewAbund*> newMap;