2015-02-20 2 views
0

У меня есть std::map<int64_t, int64_t> foo; .. он ежедневно подается XX количеством пар (не определено, они могут быть 1 или 1000).
Чтобы уменьшить использование памяти, я хочу удалить не более полезные элементы моей карты. я сделал это:Стереть больше не используется содержание std :: map

map<int64_t, int64_t> tmpMap; 
    // Copy into a new temporary map only elements to keep 
    for (map<int64_t, int64_t>::iterator it = foo.begin(); it != foo.end(); ++it) 
    { 
     // the condition decides whether a pair is still useful or not 
     if ([...]) 
     { 
      pair<int64_t, int64_t> tmpPair(it->first, it->second); 
      tmpMap.insert(tmpPair); 
     } 
    } 
    // Clear the main map 
    foo.clear(); 
    // Copy tmpMap (which contains only useful elements) into the main map 
    foo.insert(tmpMap.begin(), tmpMap.end()); 
    tmpMap.clear(); 

Любое предложение о том, как достичь своей цели в лучшую сторону с точки зрения использования ресурсов, учитывая, что foo может иметь 500/600 пары int64_t и эти линии называются каждый раз foo является кормили?

Спасибо (и простите за мой английский)

+3

Есть ли причина, что вы не только с помощью [erase' '] (http://en.cppreference.com/w/cpp/container/map/erase) метод? –

+0

Вы можете использовать стирание, но вы должны быть осторожны, так как стирание итератора делает его недействительным. Кроме того, вам нужно беспокоиться о параллелизме? Кроме того, если вы не используете свой код на встроенном устройстве, то 600 пар ничего. Очевидно, что это решение неэффективно, если размер данных значительно больше. – Andre

+0

Я не очень хорошо знаком с std :: map, и я нашел этот способ проще. В частности, я не уверен, что произойдет с ключами карты, как только вы удалите первые элементы XXX. Поэтому я подумал, что этот путь дает мне более четкую карту. Но im здесь для предложений :) @ Неверное действие итераторов Andre является именно тем, почему я использовал tmpMap. Поскольку, как сказано выше, я не очень хорошо знаком с картами, занимаюсь итераторами, недействительность - это то, что не так известно моему мозгу. – sciakysystem

ответ

3

Там нет необходимости создавать временный; просто перебираем по std::map и условно вызываем std::map::erase. Вот пример:

std::map<int,int> my_map {{1, 2}, {2, 3}, {3, 4}}; 
std::cout << my_map.size() << std::endl; // 3 
auto begin = std::begin(my_map); 
while (begin != std::end(my_map)) { 
    if (begin->first == 2) { 
     begin = my_map.erase(begin); // C++11 
    } else { 
     ++begin; 
    } 
} 
std::cout << my_map.size() << std::endl; // 2 
+0

хорошо спасибо, попробуем по этому пути. – sciakysystem

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