У меня есть 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
является кормили?
Спасибо (и простите за мой английский)
Есть ли причина, что вы не только с помощью [erase' '] (http://en.cppreference.com/w/cpp/container/map/erase) метод? –
Вы можете использовать стирание, но вы должны быть осторожны, так как стирание итератора делает его недействительным. Кроме того, вам нужно беспокоиться о параллелизме? Кроме того, если вы не используете свой код на встроенном устройстве, то 600 пар ничего. Очевидно, что это решение неэффективно, если размер данных значительно больше. – Andre
Я не очень хорошо знаком с std :: map, и я нашел этот способ проще. В частности, я не уверен, что произойдет с ключами карты, как только вы удалите первые элементы XXX. Поэтому я подумал, что этот путь дает мне более четкую карту. Но im здесь для предложений :) @ Неверное действие итераторов Andre является именно тем, почему я использовал tmpMap. Поскольку, как сказано выше, я не очень хорошо знаком с картами, занимаюсь итераторами, недействительность - это то, что не так известно моему мозгу. – sciakysystem