用于c ++的FIFO映射

时间:2014-01-22 17:32:16

标签: c++ map stl

我需要存储一些键/值对并再次通过键引用它们 - 不一定在地图中,尽管这看起来很自然。此外,如果地图超过一定的大小,我需要删除最旧的对。

有没有办法使用地图或类似结构以某种方式在C ++ 11中组合地图和队列来实现它?

更新:我想用std::unsorted_map来做这件事。不幸的是,我很遗憾std::map函数会有所帮助。无序列表似乎既不支持rbegin()也不支持--运算符,因此我也不能使用end()

有没有比循环迭代到size()-1更好的方法?

2 个答案:

答案 0 :(得分:5)

这个问题没有唯一的解决方案,最简单的方法是使用辅助队列按插入顺序存储密钥。

map<string, string> m_myMap;
queue<string>       m_myQueue;

void insert(const string& key, const string& value) {
  m_myMap.insert(make_pair(key, value));
  m_myQueue.push(key);
}

void deleteOldOnes() {
  while (m_myQueue.size() > MAX_SIZE) {
   m_myMap.erase(m_myQueue.front());
   m_myQueue.pop();
  }
}

您继续使用地图按键访问元素,不应在上述两种方法之外的任何地方使用该队列。

答案 1 :(得分:1)

#include<iostream>
#include<queue>
using namespace std;

main(){

    queue < pair <int,int> > Q; //First use a queue to store the pair wise values
    int a,b;
    // insert value to the queue as a pair
    for (int i=0;i<6;i++){ // i only insert 6 pairs
        cin>>a>>b;
        if (Q.size()>=3){   // if queue size is 3 than pop up the first value
            Q.pop();
        }

        Q.push(make_pair(a,b)); // insert a new pair into the queue
    }

    while(!Q.empty()){  // output the pairs on that queue
        cout<<Q.front().first<<" "<<Q.front().second<<endl;
        Q.pop();
    }

    return 0;
}