std::map和std::vector
阿新 • • 發佈:2019-01-01
通過map可以快速的通過key查詢元素,通過vector可以快速的檢視元素的個數和查詢第i個元素。map和vector都可以實現快速的元素插入
它們組合起來可以實現隨機訪問表,如:
osgEarthDrivers/engine_rex/TileNodeRegistry struct RandomAccessTileMap { struct Entry { osg::ref_ptr<TileNode> tile; unsigned index; }; typedef std::map<TileKey, Entry> Table; Table _table; typedef Table::iterator iterator; typedef Table::const_iterator const_iterator; typedef std::vector<Entry*> Vector; Vector _vector; iterator begin() { return _table.begin(); } const_iterator begin() const { return _table.begin(); } iterator end() { return _table.end(); } const_iterator end() const { return _table.end(); } void insert(const TileKey& key, TileNode* data) { Entry& e = _table[key]; e.tile = data; e.index = _vector.size(); _vector.push_back( &e ); } void erase(const TileKey& key) { iterator i = _table.find(key); if ( i != _table.end() ) { unsigned s = _vector.size()-1; _vector[i->second.index] = _vector[s]; _vector[i->second.index]->index = i->second.index; _vector.resize( s ); _table.erase( i ); } } const TileNode* find(const TileKey& key) const { const_iterator i = _table.find(key); return i != _table.end() ? i->second.tile.get() : 0L; } TileNode* find(const TileKey& key) { const_iterator i = _table.find(key); return i != _table.end() ? i->second.tile.get() : 0L; } unsigned size() const { return _vector.size(); } bool empty() const { return size() == 0u; } TileNode* at(unsigned index) { return _vector[index]->tile.get(); } const TileNode* at(unsigned index) const { return _vector[index]->tile.get(); } void clear() { _table.clear(); _vector.clear(); } };