显示基于1类型的结构矢量值

时间:2013-08-02 01:07:36

标签: c++ vector iterator

我目前正在尝试显示总数。基于名称的topicids和testids。 但是我在做那个显示时遇到了麻烦。我最初有一个包含所有数据的向量 例如
用户1:名称:TOPIC1:TEST1
用户1:名称:标题2:TEST1
用户2:名称:TOPIC1:TEST1
用户2:名称:标题2:TEST1

由于向量中有多个重复项,我想以下列格式显示: 的用户名:名称:numofTopics:numofTests
用户1:名称:2:2
用户1:名称: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;            
        }

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

希望有人可以帮助我。或者有更好的方法吗?  谢谢!

1 个答案:

答案 0 :(得分:1)

为什么这不起作用

您提出的解决方案根本无法正常运行。考虑在连续子序列中被认为是重复的三个元素(我使用数字来简化概念):

  

[1,1,1]

  • 迭代器首先将11进行比较,然后将push_back与第一个进行比较。
  • 然后它将 second 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上的a working sample

加成

你是对的,第一个循环中的迭代器将越过边界。解决方案非常简单: zip iterator 可以自动处理。

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

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