c – 用于迭代多图的某些元素的设计运算符

我有以下类声明:

class Dictionnary{
  private:
    map< int,list<string> > data;
  public:
    bool isPrime();
    class prime_iterator{
      private:
        map< int,list<string> >::iterator it;
      public:
        iterator(){}
        prime_iterator & operator++(){
          ++it;
            while(it != data.end() && !isPrime(it->first)){
            ++it;
          }
          return it;
        }
        ...
};

它旨在提供映射的主键上的迭代器< int,list< string>>.我不确定操作符是否实施得很好.

首先,它是一个很好的设计!= data.end()访问外部类?其次,运算符返回正确的东西还是应该只返回prime_iterator?另外,你能想到更好的解决方案吗?

最佳答案 我的建议是总是尝试在其他地方寻找解决方案 – 如果没有找到 – 那么只能自己创建:

你可以使用boost::fiter_iterator

对于你的情况,它会以这种方式看起来:

#include <boost/iterator/filter_iterator.hpp>

using DataMap = std::map<int, std::list<std::string>>;
struct is_prime_number {
  bool operator()(const DataMap::value_type& x) { return x.first % 2 == 0; }
}; // I know this is just is_even - not is_prime :D

using DataMapPrimeIter = boost::filter_iterator<is_prime_number, DataMap::iterator>;
inline DataMapPrimeIter only_prime_begin(DataMap& dataMap)
{
    return boost::make_filter_iterator<is_prime_number>(dataMap.begin(), dataMap.end());
}
inline DataMapPrimeIter only_prime_end(DataMap& dataMap)
{
    return boost::make_filter_iterator<is_prime_number>(dataMap.end(), dataMap.end());
}

用法:

int main()
{
    DataMap dataMap{{1,{"A","B"}}, {2,{"C", "D", "E"}}};
    for (auto i = only_prime_begin(dataMap), end = only_prime_end(dataMap); i != end; ++i)
    {
        std::cout << i->first << i->second.front() << std::endl;
    }
}

如果你想拥有自己的实现,或者你不能在你的项目中使用boost – 那么看看boost实现 – 它是免费的……

点赞