使用make_pair后对一些对进行分组

时间:2014-01-19 07:52:00

标签: c++ database

使用make_pair之后,我得到了一些对,即pairToCount

采用这种格式(元素1元素2)= Db中频繁的#:

(1 2) = 1
(1 3) = 1
(1 4) = 1
(2 3) = 2
(2 4) = 3
(2 5) = 1
(3 4) = 2
(5 4) = 1

我想为每个数字(1,2,3,4,5)执行以下操作:

首先,检查每对是否有数字1 ==>然后总结其频繁例如: 1以下列对存在:(1 2),(1 3),(1 4)==>频繁的总和是= 1 + 1 + 1 = 3

对2,3,4,5执行相同操作

2在(1 2),(2 3),(2 4),(2 5)==>频繁的总和是= 1 + 2 + 3 + 1 = 7

3在(1 3),(2 3),(3 4)==>频繁的总和是= 1 + 2 + 2 = 5

等等。这是我写的代码。

int sum = 0;
    int found;
    for (const auto& p1 : pairToCount)
    {   
        int r = p1.first.first;
        std::cout << " (" << r;

        for (const auto& p2 : pairToCount)
        {
            if (r == p2.first.first)
            {
                sum += p2.second;
                found = p2.first.second;
            }

            else if (r == p2.first.second)
            {
                sum += p2.second;
                found = p2.first.first;
            }
            else
                exit;
            std::cout << "," << found ;
        }
        std::cout <<  ") = "<< sum << "\n ";
        sum = 0;
    }

我得到了复制打印最后一个元素和相同的测试 +  由于没有以4开头的对,因此在这种情况下代码不起作用。

结果如下:

 (1,2,3,4,4,4,4,4,4) = 3
 (1,2,3,4,4,4,4,4,4) = 3
 (1,2,3,4,4,4,4,4,4) = 3
 (2,1,1,1,3,4,5,5,5) = 7
 (2,1,1,1,3,4,5,5,5) = 7
 (2,1,1,1,3,4,5,5,5) = 7
 (3,5,1,1,2,2,2,4,4) = 5
 (5,4,4,4,4,4,2,2,4) = 2

我只是学习make_pair,花了4个小时阅读它,看看是否有任何例子或类似的问题可以指导我但没有运气!

1 个答案:

答案 0 :(得分:2)

您可以使用map(或unordered_map,如果您有C ++ 11或来自提升)来大大简化您的问题。

这个想法是在你的对/频率列表上迭代一次,并将每个键的部分和存储在地图中。然后,您可以在第二个循环中打印出总和。

#include <map>

// ...

std::map<int,int> sums;
for (const auto& p1 : pairToCount)
  sums[p1.first.first]  += p1.second;
  sums[p1.first.second] += p1.second;
}

for (const auto& k : sums) {
  // print what you want
}