Вы можете использовать BOOST_FOREACH
.Вы должны будете использовать typedef для ясности:
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
typedef std::pair<bool, inner_map> map_entry;
BOOST_FOREACH(map_entry& p, items)
{
...
}
Я предпочитаю простой typedef
и цикл for.Я вижу typedef
точно так же, как вижу назначение переменной:
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
typedef std::map<bool, inner_map>::iterator map_iterator;
for (map_iterator i = items.begin(); i != items.end(); ++i)
{
...
}
Эти typedefs также могут быть закрытыми членами.Этот стиль кодирования намного понятнее, так как вы сразу видите задействованные типы.
Или вы можете использовать обычный std::for_each
, если вы готовы написать функтор.Мне не очень нравится это в стандартном C ++, так как тело цикла больше не является локальным (однако в некоторых случаях это может быть преимуществом):
struct some_functor
{
template <typename K, typename V>
void operator()(std::pair<K, V>& item)
{
// In the context below, K is bool and
// V is map<string, pair<string, int> >
}
};
, а затем
std::for_each(items.begin(), items.end(), some_functor());
Если вы обновитесь до VS2010, у вас есть альтернативы: auto
и std::for_each
с лямбдой (что я предпочитаю).С C ++ 0x, технически, у вас также есть циклы на основе диапазона (недоступно в VS2010).
В заключение я бы сделал:
class meaningful_data
{
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
std::map<bool, inner_map> items;
public:
typedef std::pair<bool, inner_map> value_type;
typedef std::map<bool, inner_map>::iterator iterator;
typedef std::map<bool, inner_map>::const_iterator const_iterator;
iterator begin() { return items.begin(); }
const_iterator begin() const { return items.begin(); }
iterator end() { return items.end(); }
const_iterator end() const { return items.end(); }
// Add some interface here (as small as possible)
};
и итерацию следующим образом:
for (meaningful_data::iterator i = d.begin(); i != d.end(); ++i)
{
...
}
или
BOOST_FOREACH(meaningful_data::value_type& i, d)
{
...
}
Возможно, вы захотите инкапсулировать такой сложный тип, по крайней мере, с несколькими определениями типов (вы не обязаны использовать полноценный классесли тип inner_map
должен быть открытым).