是否可以通过其地址访问STL deque元素?

时间:2011-06-28 17:08:26

标签: c++ visual-studio stl

下午好,我们正在尝试对Windows内存映射缓存子系统进行简单的仿真。我们正在使用几种STL数据结构。

  1. STL deque,std::deque<Range>访问,它保存并记录最近最近使用的最近使用的内存映射区域的信息。
  2. STL集std::set<char *> ranges_pointer,它可能包含指向STL deque中元素的指针。
  3. 基本上,当我们从STL集中检索指向有效内存映射区域的指针时,我们希望使用该指针直接访问O中的相应元素deque(常量时间)。然后,我们想将该deque元素移动到STL双端队列的前面,以便可以在STL deque访问的前面找到后续的内存映射addreses集群的命令。

    我们从Stack Overflow了解到,唯一保证具有相同地址的STL容器是STL向量。但是,每次从STL向量移动元素时,需要O(线性)时间来将剩余项目移位或记忆到正确的位置,这可能很昂贵。相反,当您从STL双端队列移动元素时,所有人都必须重新排列移动元素两侧的next和prev指针。

    我们想知道是否可以通过其地址编写访问STL deque元素的方法。虽然std :: allocator不保证连续的STL deque地址,但也许我们可以使用自定义内存池分配器来获取一块连续的地址。

    此外,BOOST或其他C ++框架实现了连续的双向链表,它们提供随机访问,就像STL deque一样。 Range类保存有关每个缓存的内存映射区域的所有基本信息。类Range存储在std :: deque accessess成员变量中。谢谢。类范围如下所示:

    class Range { 
         public:   
             explicit Range(int item){
                mLow = item;
                mHigh = item;
                mPtr  = 0;
                mMapPtr = 0;
             }
             Range(int low, int high, char* ptr = 0,char* mapptr = 0,  
                   int currMappedLength = 0){  
                mLow = low;
                mHigh = high;
                mPtr  = ptr;
                mMapPtr = mapptr;
                mMappedLength = currMappedLength;       
             }
             Range(void){  
                mLow = 0;
                mHigh = 0;
                mPtr  = 0;
                mMapPtr = 0;
             }
    
    
             ~Range(){
             }
    
             bool operator<(const Range& rhs) const{
                    return mHigh < rhs.mHigh;
             } 
             int low() const { return mLow; }   
             int high() const { return mHigh; }
             char* getMapPtr() const { return mMapPtr; }
             int getMappedLength() const { return mMappedLength; }
         private:   
             int mLow;   // beginning of memory mapped region
             int mHigh;  // end of memory mapped region 
             char* mMapPtr; // return value from MapViewOfFile
             int mMappedLength; // length of memory mapped region
    }; // class Range 
    

1 个答案:

答案 0 :(得分:3)

而不是使用set来保存地址,包含地址的mapdeque中的迭代器怎么样?

请注意,将元素从双端队列中间移动到开头或结尾并不比向量处理要快。您可能想要考虑使用list