【问题标题】:Logical question with map<set,vectors>?map<set,vectors> 的逻辑问题?
【发布时间】:2011-03-11 02:39:40
【问题描述】:

我有一张地图map&lt;set,vector&gt; m1。它的值如下:

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

现在我必须在向量的每一列中找到最大值,我可以通过迭代所有行轻松地做到这一点,并将其存储在一个向量中,例如 v1&lt;6,4&gt;

现在的问题是我想找到构成这个值的所有对。把它想象成可以在地图中产生&lt;6,4&gt; 的所有可能组合。即我的结果也应该是一个看起来像这样的地图:

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

编辑:

为了解释更多,让地图中的集合充当相应向量的id。现在,该地图中的所有向量“组合”可以产生 是什么?注意这里的聚合函数是max。即给定向量&lt;2,4&gt;&lt;6,2&gt;,它们之间的最大值是&lt;6,4&gt; 所以id 的(1 和2)和(2 和3)等等可以给我。

我试图做的是遍历 m1 中向量的每一列,并在找到 6 时存储相应的 set 值,在此示例中为 &lt; &lt;2&gt; &lt;6,2&gt; &gt;&lt; &lt;4&gt;,&lt;6,1&gt; &gt; 并为第二列。现在我不知道如何整合它来得到我的结果。

【问题讨论】:

  • 我只使用集合作为 ID,因为 id 1 中有值 4,id 2 中有 6。我想证明 id 的 1,2 可以在 v1 中产生最大值。
  • 这本书我只看了四遍,很慢。然后我查看了现在存在的两个答案。我还是不明白这个问题。在&lt; &lt;1&gt;, &lt;2,4&gt; &gt; 中,&lt;1&gt; 部分是带有一个元素的 std::set,&lt;2,4&gt; 部分是带有两个元素的 std::vector? maximum values in each column of the vector 是什么意思——向量是一维的,为什么是行/列的措辞?
  • 给定一个具有 的向量 v1,我想在 map 中找到第一个元素为 6,第二个元素为 4 的所有值在地图中。把它想象成一个8皇后问题。首先,我在地图中找到具有 6 的值,然后搜索具有 4 的值的第二个元素并作为输出。一旦我没有更多的 4,我会回溯并找到下一个 6 并做同样的事情,依此类推..
  • @Frerich:你能明白我的想法吗?
  • @Sunil:我以为我明白你的意思,但后来我看到 xjdrew 实现了与你描述的完全相同的算法——但你不接受这一点。所以我一定错过了什么。对于给定映射中的每个向量,检查向量是否以v1 开头(即第一个元素是6,第二个元素是4)。如果是这样,请通过在某处存储迭代器来记住该地图元素。

标签: c++ vector map set


【解决方案1】:
#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);
  }
}

我不知道这是否有编译错误,但你可以明白这一点。

【讨论】:

    【解决方案2】:
    #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::equal 比较两个向量。

    【讨论】:

    • 这并没有给出我的答案。这只是比较两个向量。这只是查找是否存在值为 &lt;6,4&gt; 的向量,但这不是我想要的。
    • 可以修改 ret 值类型为 map 并将 ret.push_back(it) 改为 ret[*it] = it->second。
    • 您能详细说明一下吗?谢谢
    • 请用typedef替换那个丑陋的#define
    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多