我目前正在尝试显示总数。基于名称的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 元素?我在第二次迭代中所做的是正确的吗?
希望有人可以帮助我。或者有更好的方法吗? 谢谢!
答案 0 :(得分:1)
您提出的解决方案根本无法正常运行。考虑在连续子序列中被认为是重复的三个元素(我使用数字来简化概念):
[1,1,1]
1
与1
进行比较,然后将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上的a working sample。
你是对的,第一个循环中的迭代器将越过边界。解决方案非常简单: zip iterator 可以自动处理。
for (auto elem_pair : zip(v, v | drop(1)))
if (elem_pair.first == elem_pair.second)
...
Boost.Range拥有允许该代码工作的工具。不过,它仍然会受到我提到的问题的影响。