typedef unordered_map<int,double> ColumnMap;
typedef ColumnMap::const_iterator ColumnMapIter;
...
for(ColumnMapIter it = row->begin(); it != row->end(); ++it) {
ColumnMap *tmp = other -> rlist[it -> first];
ColumnMapIter it_col = tmp -> find(col);
if (it_col != tmp->end()) {
val += (it -> second ) * (it_col -> second);
}
}
Согласитесь, что в этих first и second чёрт ногу сломит. Однако в плюсах имеется такая редкоиспользуемая фича, как указатели на члены класса. Почитать про них можно, например, здесь: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=142С их-то помощью и можно заменить first и second на что-нибудь более понятное.
Смотрите:
typedef unordered_map<int,double> ColumnMap;
typedef ColumnMap::const_iterator ColumnMapIter;
...
typedef ColumnMap::value_type ColumnMapPair;
const ColumnMapPair::first_type ColumnMapPair::* column = &ColumnMapPair::first;
ColumnMapPair::second_type ColumnMapPair::* value = &ColumnMapPair::second;
...
for(ColumnMapIter it = row->begin(); it != row->end(); ++it) {
ColumnMap *tmp = other -> rlist[*it.*column];
ColumnMapIter it_col = tmp -> find(col);
if (it_col != tmp->end()) {
val += (*it.*value) * (*it_col.*value);
}
}

No comments:
Post a Comment