У меня есть карта со следующими данными:
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
Предыдущая и следующая строка на карте 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. Заранее спасибо!!
Если вы просто выполните итерацию по карте, вы получите итераторы, которые указывают на пары в порядке по ключу. Так что если вы помните предыдущий итератор во время итерации, у вас будет два последовательных итератора, из которых вы сможете заполнить свои новые векторы.
С другой стороны, поскольку вы всегда можете найти следующий и предыдущий ключи в упорядоченной карте (хотя на это требуется O (log n) времени), на самом деле, возможно, нет необходимости переходить ко всем трудностям для денормализации данных. Если вы используете c ++ 11, вы найдете std :: next и std :: prev, которые действительно облегчат выполнение этих операций. (Если нет — почему нет? — вы можете легко определить их в терминах std :: advance.)
Других решений пока нет …