我有以下类声明:
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?另外,你能想到更好的解决方案吗?
最佳答案 我的建议是总是尝试在其他地方寻找解决方案 – 如果没有找到 – 那么只能自己创建:
对于你的情况,它会以这种方式看起来:
#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实现 – 它是免费的……