在 typedef map中添加向量

发布于 2024-10-20 22:25:38 字数 1445 浏览 2 评论 0原文

我有一个数据结构如下,

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));
    }

谢谢。

I've a data structure as follows

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

Lets say the map m1 that has following values :

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

and I've a separate vector v1 that has values like

<1,3,4>

Now what I want to do is to add the vectors the first, third and fourth vectors in the map and the result should be stored in a new map say mtot as

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

Here is my following try that results in a segmentation fault:
Any help, improvement or even your idea of implementation is greatly appreciated.

  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));
    }

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千年*琉璃梦 2024-10-27 22:25:38

容器

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

您插入的这一行没有插入到适当的位置,并且不是结果

mtot.insert(mtot.end(),make_pair(stemp,vtot));

this line you insert not in appropriate position and not the resulting container

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

it can be

mtot.insert(mtot.end(),make_pair(stemp,vtot));
送你一个梦 2024-10-27 22:25:38

由于 xitx 的回答,我认为您的代码现在可以工作了。
我在您的代码中没有特别发现重大问题。
顺便说一下,不需要为 insert 成员函数指定 iterator
setmap
供您参考,我测试时以下代码有效:

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));
}

希望这有帮助

I presume your code works now thanks to xitx's answer.
I couldn't find significant problems in your code particularly.
Incidentally, iterator doesn't need to be specified for insert member function
of set and map.
For your information, the following code worked when I tested:

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));
}

Hope this helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文