2

我目前正在尝试显示总数。基于名称的 topicids 和 testids。但是我在做那个显示时遇到了麻烦。我最初有一个包含所有数据的向量。
例如
user1:name:topic1:test1
user1:name:topic2:test1
user2:name:topic1:test1
user2:name:topic2:test1

由于向量中有多个重复项,我想以以下格式显示: username:name:numofTopics:numofTests
user1:name:2:2
user1:name:2:2

因此,我想将名称与向量中的下一个名称进行比较,并将元素推入一个名为 singleAcc 的新向量。这样做的目的是将重复元素显示为ONE元素。

下面是我显示数据的代码

        vector<AccDetails> singleAcc;
        for (vector<AccDetails>::iterator itr=accInfo.begin();itr!=accInfo.end()-1; ++itr) {
            if (itr->name == itr[1].name) {
                //cout << (*itr) << endl;
                singleAcc.push_back(*itr);
            }
        }

        for (vector<AccDetails>::iterator itr = singleAcc();itr!=singleAcc();++itr) {
            cout << left
                    << setfill(' ')
                    << setw(20) << itr[0].username
                    << setw(20) << itr[0].name
                    << setw(20) << countTopics(itr->name)
                    << setw(20) << countTests()
                    << endl;            
        }

问题:在第一次向量迭代中,名称不会与 的最后一个元素 bcoz 进行比较accDetails.end()-1
如何将重复元素显示为一个元素?我在第二次迭代中所做的是否正确?

希望有人可以帮助我。还是有更好的方法来做到这一点?谢谢!

4

1 回答 1

1

为什么这不起作用

您提出的解决方案根本无法按预期工作。考虑三个在连续子序列中被视为重复的元素(我使用数字来简化概念):

[1,1,1]

  • 迭代器将首先比较11然后push_back是第一个。
  • 然后它将第二个 1与第三个进行比较,后者再次返回 true,并且本应没有重复的结果结束:

[1,1]

所以这显然不是你想做的事情。一般来说,这看起来是一个相当奇怪的问题,但是请解决您在此处发布的这一部分,我建议使用std::multiset.

更好的解决方案

name就像您在此处所做的那样,创建一个测试该字段的比较器。

然后,恢复唯一字段相当简单:

std::multiset<AccDetail> s;
for (auto element_it = s.begin(); element_it != s.end(); element_it = s.upper_bound(*element_it)) {
    auto er = s.equal_range(*element_it);

    // use this to get all the elements with given name
    for (auto i = er.first; i != er.second; ++i)
        cout << *i << " ";

    // use this to get the number of them
    cout << std::distance(er.first, er.second);
}

请参阅Coliru 上的工作示例

奖金

你是对的,第一个循环中的迭代器会越界。解决方案相当简单:zip 迭代器,它可以自动处理这个问题。

for (auto elem_pair : zip(v, v | drop(1)))
    if (elem_pair.first == elem_pair.second)
        ...

Boost.Range 具有允许该代码工作的工具。不过,它仍然会遭受我提到的问题的困扰。

于 2013-08-02T08:27:09.353 回答