2014-01-03 3 views
1

У меня есть глобальная переменная:C++ 11: станд :: unordered_map <Int, станд :: стек <int>> получать значения из карты без копирования несколько раз

std::unordered_map<int, std::stack<int>> intTable; 

Чтобы добавить к этому, я это делаю В настоящее время (я видел C++ 11 списков инициализатора, но я не уверен, если я ударю этот Visual C++ 11 2013 ошибка ->http://connect.microsoft.com/VisualStudio/feedback/details/807966/initializer-lists-with-nested-dynamically-allocated-objects-causes-memory-leak)

std::stack<int> s; 
    s.push(10); 

тогда я

intTable[integerKey] = s; 

я тогда нужно добавить в стек иногда, и проверить его верхнее значение так, и если оно больше, чем значение, мне нужно, чтобы вытолкнуть его и удалить ключ из карты:

intTable[integerKey].push(20); 

    if (intTable[integerKey].top() >= someIntegerValue) 
    { 
     intTable[integerKey].pop(); 

     if (intTable[integerKey]->size() == 0) 
     { 
      intTable.erase(integerKey); 
     } 
    } 

Мои вопрос есть лучший способ сделать это? Например, одна из неэффективных я вижу, что я индексирование на карту несколько раз. Можно ли это избежать? Как сохранить ссылку на intTable [integerKey], не копируя ее?

ответ

2

Элементы карты инициализируются конструктором по умолчанию при доступе.

std::stack<int> &localReference = intTable[integerKey]; 

Выделяет стек (если он не существует) и возвращает ссылку на стек.

1

Вы можете сделать

std::stack<int> &localReference = intTable[integerKey]; 

В начале вашей функции и доступ к локальной справки впоследствии, хотя компилятор, скорее всего, оптимизировать на intTable [integerKey] в любом случае в пределах локальной функции, так что не может быть никакой разницы в фактический код сборки.

+1

Кроме того, если вы хотите удалить без повторного поиска, используйте 'find' для получения итератора на карте. – Arkadiy

+0

Я понятия не имел, что могу передать итератор, чтобы удалить ключ! – halivingston

+0

Если у меня есть итератор, могу ли я также использовать его для получения значения с карты? В настоящее время я всегда делаю .find() .. тогда, если он существует, я извлекаю ключ, выполняя mymap [key] ... – halivingston

0

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

Смежные вопросы