Добавление векторов в карте typedef - PullRequest
0 голосов
/ 10 марта 2011

У меня есть структура данных следующим образом

typedef vector<double> v_t;
typedef set<int> s_t;
typedef map<s_t, v_t> m_t;

Допустим, карта m1 имеет следующие значения:

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

и у меня есть отдельный вектор v1, который имеет значения типа

<1,3,4>

Теперь я хочу добавить векторы к первому, третьему и четвертому векторам на карте, и результат должен быть сохранен в новой карте, скажем mtot как

< <1,3,4>,<8,8,8,8> >

Вот моя следующая попытка, которая приводит к ошибке сегментации: Любая помощь, улучшение или даже ваша идея реализации очень ценится.

  s_t stemp,stemp1;
  v_t vtot(4); //I know the size
  typedef v_t::iterator v_it;
  typedef m_t::iterator m_it;
  // Assume I've v1 and m1 in hand

        for(v_it it(v1.begin());it != v1.end();++it)
             {
               stemp1.insert(stemp1.end(),*it);
               m_it mit = m1.find(stemp1);
               copy(mit->second.begin(),mit->second.end(),ostream_iterator<int>(cout," ")); cout << endl; // Debug not working. There is some problem with the iterator I guess
               transform(mit->second.begin(),mit->second.end(),vtot.begin(),vtot.begin(),plus<double>()); 
               stemp1.clear();
             }
             stemp.insert(v1.begin(),v1.end());
             mtot.insert(mtot.end(),make_pair(stemp,vtot));
    }

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

эту строку вы вставляете не в соответствующую позицию и не в получившийся контейнер

mtot.insert(sample.end(),make_pair(stemp,vfinal));

это может быть

mtot.insert(mtot.end(),make_pair(stemp,vtot));
1 голос
/ 10 марта 2011

Полагаю, ваш код работает сейчас благодаря ответу xitx.
Я не смог найти значительных проблем в вашем коде, в частности.
Кстати, iterator не нужно указывать для insert функции-члена set и map.
Для вашей информации при тестировании работал следующий код:

int main() {
  m_t m1, mtot;
  s_t s;
  s.clear();  s.insert( 1 );  m1[ s ].assign( 4, 1 );
  s.clear();  s.insert( 2 );  m1[ s ].assign( 4, 2 );
  s.clear();  s.insert( 3 );  m1[ s ].assign( 4, 3 );
  s.clear();  s.insert( 4 );  m1[ s ].assign( 4, 4 );

  v_t  v1;
  v1.push_back( 1 );
  v1.push_back( 3 );
  v1.push_back( 4 );

  v_t vtot(4);

  for(v_it it(v1.begin());it != v1.end();++it)
  {
    s_t stemp1;
    stemp1.insert(*it);
    m_it mit = m1.find(stemp1);
    if ( mit == m1.end() ) continue;
    copy(mit->second.begin(),mit->second.end(),ostream_iterator<int>(cout," ")); cout << endl;
    transform(mit->second.begin(),mit->second.end(),vtot.begin(),vtot.begin(),plus<double>()); 
  }
  s_t stemp(v1.begin(),v1.end());
  mtot.insert(make_pair(stemp,vtot));
}

Надеюсь, это поможет

...