是否有一个Java Map keySet()等价于C的std :: map?

前端之家收集整理的这篇文章主要介绍了是否有一个Java Map keySet()等价于C的std :: map?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有一个 Java Map keySet()等价于C的std :: map?

Java keySet()方法返回“a set view of the keys contained in this map.”

解决方法

到目前为止所呈现的所有答案最终都是直接创建一个std :: set,这可能并不理想:如果只希望能够迭代键,那么您不希望创建一个全新的容器.

一个更灵活的选择是使用一个转换迭代器,它将一个std :: map迭代器转换成某种类型的迭代器,这个迭代器在取消引用时才产生关键字.这是使用Boost Transform Iterator非常简单的:

  1. #include <functional>
  2. #include <boost/iterator/transform_iterator.hpp>
  3.  
  4. // You may already have a select1st implementation; if not,you should :-)
  5. template <typename Pair>
  6. struct select1st
  7. : std::unary_function<const Pair&,const typename Pair::first_type&>
  8. {
  9. const typename Pair::first_type& operator()(const Pair& p) const
  10. {
  11. return p.first;
  12. }
  13. };
  14.  
  15. template <typename C>
  16. boost::transform_iterator<
  17. select1st<typename C::value_type>,typename C::const_iterator
  18. > begin_keys(const C& c)
  19. {
  20. return boost::make_transform_iterator(
  21. c.begin(),select1st<typename C::value_type>()
  22. );
  23. }
  24.  
  25. template <typename C>
  26. boost::transform_iterator<
  27. select1st<typename C::value_type>,typename C::const_iterator
  28. > end_keys(const C& c)
  29. {
  30. return boost::make_transform_iterator(
  31. c.end(),select1st<typename C::value_type>()
  32. );
  33. }

使用这些实用功能,您可以将任意范围的std :: map迭代器(或迭代器转换为任何其他对关联容器)转换为仅一个键的范围.举个例子:

  1. #include <iostream>
  2. #include <iterator>
  3. #include <map>
  4.  
  5. int main()
  6. {
  7. std::map<int,int> m;
  8. m.insert(std::make_pair(1,2));
  9. m.insert(std::make_pair(2,4));
  10. m.insert(std::make_pair(3,6));
  11.  
  12. std::copy(
  13. begin_keys(m),end_keys(m),std::ostream_iterator<int>(std::cout,","));
  14. }

该程序输出

  1. 1,2,3,

如果你真的想要一个包含键的std :: set,你可以使用这些迭代器轻松创建一个:

  1. std::set<int> s(begin_keys(m),end_keys(m));

总的来说,这是一个更灵活的解决方案.

如果你没有Boost或者不想使用Boost或者不能使用Boost,这个特定的变换迭代器可以很容易的实现:

  1. #include <iterator>
  2.  
  3. template <typename C>
  4. class key_iterator
  5. : public std::iterator<
  6. std::bidirectional_iterator_tag,typename C::key_type,typename C::difference_type,typename C::pointer,typename C::reference
  7. >
  8. {
  9. public:
  10.  
  11. key_iterator() { }
  12. explicit key_iterator(typename C::const_iterator it) : it_(it) { }
  13.  
  14. typename const C::key_type& operator*() const { return it_->first; }
  15. typename const C::key_type* operator->() const { return &it_->first; }
  16.  
  17. key_iterator& operator++() { ++it_; return *this; }
  18. key_iterator operator++(int) { key_iterator it(*this); ++*this; return it; }
  19.  
  20. key_iterator& operator--() { --it_; return *this; }
  21. key_iterator operator--(int) { key_iterator it(*this); --*this; return it; }
  22.  
  23. friend bool operator==(const key_iterator& lhs,const key_iterator& rhs)
  24. {
  25. return lhs.it_ == rhs.it_;
  26. }
  27.  
  28. friend bool operator!=(const key_iterator& lhs,const key_iterator& rhs)
  29. {
  30. return !(lhs == rhs);
  31. }
  32.  
  33. private:
  34.  
  35. typename C::const_iterator it_;
  36. };
  37.  
  38. template <typename C>
  39. key_iterator<C> begin_keys(const C& c) { return key_iterator<C>(c.begin()); }
  40.  
  41. template <typename C>
  42. key_iterator<C> end_keys(const C& c) { return key_iterator<C>(c.end()); }

这个用法与Boost版本相同.

猜你在找的Java相关文章