Логический вопрос с картой? - PullRequest
0 голосов
/ 11 марта 2011

У меня есть карта map<set,vector> m1.Он имеет следующие значения:

< <1>,<2,4> >
< <2>,<6,2> >
< <3>,<3,4> >
< <4>,<6,1> >
< <5>,<1,1> >

Теперь мне нужно найти максимальные значения в каждом столбце вектора, и я легко это делаю, перебирая все строки и сохраняя его в векторе, скажем v1as <6,4>.

Теперь проблема в том, что я хочу найти все пары, которые составляют это значение.Думайте об этом как о возможных комбинациях, которые могут дать <6,4> на карте.т.е. мой результат также должен быть картой, которая выглядит примерно так:

< <1,2>,<6,4> >
< <2,3>,<6,4> >
< <1,4>,<6,4> >
< <3,4>,<6,4> >

РЕДАКТИРОВАТЬ:

Чтобы объяснить больше, пусть набор в карте действует какid соответствующего вектора.Теперь, что все векторы в этой карте, «объединенные», могут дать <6,4>?Обратите внимание, что агрегатная функция здесь max.т. е. для векторов <2,4> и <6,2> максимальное значение между ними равно <6,4>, поэтому идентификаторы (1 и 2) и (2 и 3) и т. д. могут дать мне <6,4>.

То, что я пытался сделать, это перебирать каждый столбец вектора в m1 и сохранять соответствующие значения set всякий раз, когда я нахожу 6, в этом примере < <2> <6,2> > и < <4>,<6,1> >, и делать то же самое для второгоколонка.Теперь я не знаю, как интегрировать его, чтобы получить мой результат.

Ответы [ 2 ]

0 голосов
/ 11 марта 2011
#define SI map<set,vector>::iterator

vector<SI> ret;
for(SI it=m1.begin();it!=m1.end();it++){
    if(equal(v1.begin(),v1.end(),it->second.begin()){
        ret.push_back(it);
    }
}

используйте std :: равно, чтобы сравнить два вектора.

0 голосов
/ 11 марта 2011
#define SI map<set,vector>::iterator

mx = find_max();
vector<set> ret;
for(SI it=m1.begin();it!=m1.end();it++){
  for(SI it2=it;it2=m1.end();it++){
     if(it==it2)continue;//nasty
     if(find_max2(it,it2)==mx)
        ret.push_back(it->first,it2->first);
  }
}

Я не знаю, есть ли в этом ошибки компиляции, но вы можете понять, в чем дело.

...