2013-10-24 96 views
0

我注意到std :: unique的行为并不像它应该的样子,当我有一个大小约为2000的向量时。我尝试使用一个更小的向量来实现唯一性,并且按照预期执行。我通过在两个向量中添加大约30个重复条目来测试这一点。如预期的那样,在较小的向量中,独特地将这些额外的29个条目放在向量的末尾。但是,在较大的向量中,重复条目中只有一个条目存在。我有可能超出限制吗?大小矢量都使用相同的代码。std :: unique是否有大小限制?

sort(dbaselista.begin(),dbaselista.end()); 
vector<string>::iterator lasta = unique(dbaselista.begin(),dbaselista.end()); 
//dbaselista.erase(lasta, dbaselista.end()); 

作为一个简单的例子,

小载体:19AB 175D 12AC 19F7 19F7 19F7 19F7 209C 20AF

结果:12AC 175D 19AB 19F7 209C 20AF 19F7 19F7 19F7

如果我跑具有更大矢量的相同代码19F7将只存在一次。

+1

发布您的代码,杜拜。 – catscradle

+0

最好用实际的代码来演示问题。 – BartoszKP

回答

6

std::unique()承诺要做的唯一事情是返回已删除重复项的范围。函数运行后,它返回的新结束迭代器之外的项目不需要任何东西,因此它们可以是任何东西。

+0

好的,看起来像更大的矢量正在发生的事情,它似乎仍然有效。然而,只是好奇,为什么它没有遵循相同的约定,就像在更小的向量中填充新的结束迭代器之外的项目一样?此外,小矢量功能的好处是我可以识别哪些条目是重复的。 –

+0

@MarkHsiung:我不知道为什么它在两个输入上表现不同,但我知道标准为什么没有保证它会如何表现这些过去的新端元素的更高级的原因:它是因此一些未知的未来优化将使函数在'[start,new_end)'范围内的行为保持不变,但恰好导致对该范围的其余部分进行不同处理,仍然可以实现(从而加速所有程序在不违反标准的情况下调用'unique()'。 –

+0

@MarkHsiung:一个好的库可能会考虑诸如高速缓存行大小之类的事情。在单个高速缓存行中移动元素实际上是免费的,将它们移动到另一个高速缓存行非常昂贵。 – MSalters

相关问题