c – 创建STL映射键迭代器

前端之家收集整理的这篇文章主要介绍了c – 创建STL映射键迭代器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通常,您有一个类似map< string,X>的地图.其中键是映射值的名称,您需要一个API,让消费者可以看到所有名称…例如填充GUI列表框.
您可以构建一个向量并将其作为API调用返回,但这样效率很低.您可以只返回对地图的引用,但随后也可以访问这些值,您可能不希望这样.

那么你怎么能写一个兼容的类KeyIterator,它包装map并提供对该map中键的标准迭代器访问.

例如:

map<string,X> m= ...
KeyIterator<string> ki(m);
for(KeyIterator<string>::iterator it=ki.begin();it!=ki.end();++it)
 cout << *it;

KeyIterator应该是轻量级的,因此您可以从几乎没有开销的方法返回它.

编辑:
我不确定我是否完美解释过,让我给出一个更好的用例(半伪):

class PersonManager
{
 private:
  map<string,Person> people;
 public:
  //this version has to iterate the map,build a new structure and return a copy
  vector<string> getNamesStandard();

  //this version returns a lightweight container which can be iterated
  //and directly wraps the map,allowing access to the keys
  KeyIterator<string> getNames();
};

void PrintNames(PersonManager &pm)
{
 KeyIterator<string> names = pm.getNames();
 for(KeyIterator<string>::iterator it=names.begin();it!=names.end();++it)
  cout << *it << endl;
}

解决方法

#include <map>
#include <string>
#include <iterator>

template <class map>
class KeyIterator { 
    typename map::const_iterator iter_;
public:
    KeyIterator() {}
    KeyIterator(typename map::iterator iter) :iter_(iter) {}
    KeyIterator(typename map::const_iterator iter) :iter_(iter) {}
    KeyIterator(const KeyIterator& b) :iter_(b.iter_) {}
    KeyIterator& operator=(const KeyIterator& b) {iter_ = b.iter_; return *this;}
    KeyIterator& operator++() {++iter_; return *this;}
    KeyIterator operator++(int) {return KeyIterator(iter_++);}
    const typename map::key_type& operator*() {return iter_->first;}
    bool operator==(const KeyIterator& b) {return iter_==b.iter_;}
    bool operator!=(const KeyIterator& b) {return iter_!=b.iter_;}
};

int main() {
    std::map<std::string,int> m;
    KeyIterator<std::map<std::string,int> > ki;
    for(ki=m.begin(); ki!=m.end(); ++ki)
        cout << *ki;
}

http://codepad.org/4wxFGGNV没有比这更轻量级.但是,它需要在地图类型上模板化迭代器,而不是键类型,这意味着如果您试图隐藏内部,则必须提供一些实现细节.

猜你在找的C&C++相关文章