2016-01-19 3 views
2

У меня есть часть кода, управляющая объектом map<int,int>. Предположим, что в какой-то момент я хочу удвоить все записи, ключи и значения. Есть ли способ сделать это на месте, не создавая новую карту, не зацикливаясь и не вводит обновленные записи?Обновить карту на месте

Моя забота - экономить пространство памяти.

+3

Пожалуйста, покажите свой код, обратите внимание, что изменение ключей Твоих карт будет аннулированием итератора используются как карта должна быть заказана, и почему вы хотите изменить ключ таким образом? Вы уверены, что хотите «отобразить»? – EdChum

+0

Я не думаю, что даже если вы найдете что-то вроде этого, это сэкономит массу памяти или вычислительную мощность. В конце концов, большинство из этих функций просто делают то, чего вы хотите избежать в фоновом режиме. – Sossenbinder

+1

Ваша проблема не совсем определена. Удвоение ключа может дать вам ключ от элемента, который уже существует. Какое значение вы бы тогда удвоили? – juanchopanza

ответ

2

Удвоение значения можно так:

std::map<int,int> my_map; 
for(auto& item:my_map){ 
    item.second*=2; // double all values 
} 

Однако, это не представляется возможным удвоить Key так item от типа std::pair<const int,int>. Обратите внимание на const за Key.

Предложение:

Я думаю std::map не лучший контейнер для этого случая. Попробуйте так:

std::vector<std::pair<int,int>> my_simi_map; 
for(auto& my_simi_map){ 
    item.first*=2; // double all keys 
    item.second*=2; // double all values 
} 

Edit:

Моя забота экономит пространство памяти.

Если это проблема с памятью, то вы можете выбрать элемент с карты и вставить его на удвоенную версию на новой карте и сразу удалить его со старой карты. В этом случае вы потеряете размер только одного элемента карты, а не всю другую карту.

1

Вы можете перемещать карту в обратном порядке ключа для положительных клавиш, чтобы обойти побочные эффекты и создать новые пары ключ/значение. Вы можете сделать эквивалент для отрицательных ключей.

#include <cstdio> 
#include <algorithm> 
#include <map> 

using namespace std; 

int main() { 
    map<int, int> m = { 
    {10, 20}, 
    {-5, 23}, 
    {-10, 7}, 
    {20, 30}, 
    {15, 21}, 
    {18, 2}, 
    }; 

    for (auto it = m.begin(); it != m.end() && it->first < 0; it = m.erase(it)) { 
    m[it->first * 2] = 2 * it->second; 
    } 

    for (auto it = m.rbegin(); it != m.rend() && it->first > 0; it++) { 
    m[it->first * 2] = 2 * it->second; 
    m.erase(----it.base()); 
    } 

    for (auto &p: m) { 
    printf("%d, %d\n", p.first, p.second); 
    } 
} 

Выход:

-20, 14 
-10, 46 
20, 40 
30, 42 
36, 4 
40, 60 
Смежные вопросы