如何从排序中停止std :: set?

use*_*439 2 c++ sorting algorithm containers set

我有一系列名称,但我只需要唯一的名称.我使用std::set它以便清除重复.但我需要名称以与输入相同的顺序出现.这意味着如果我的输入是:

Mary
Mary
John
John
John
Apple
Apple
Apple
Run Code Online (Sandbox Code Playgroud)

[编辑]:在检查评论/答案后,我想强调每个名字出现在组中,并且稍后不会在输入中显示.参考示例,Mary出现两次,即.它稍后不会再出现.[/编辑]

我希望我的输出是:

Mary
John
Apple
Run Code Online (Sandbox Code Playgroud)

使用std::set,我得到排序的:

Apple
John
Mary
Run Code Online (Sandbox Code Playgroud)

我发现有unordered_set(来自{ cplusplus.com }).这其中又确实不能保持输入顺序.

题:

  1. 有没有办法阻止std::set排序?
  2. 我已经读过{ 人们可以编写自己的排序方法std::set }.现在,如果我无法阻止set排序,那么编写我自己的排序方法怎么样,但总是将输入的第一个元素作为最小值返回?(如果我能了解如何做到这一点......)
  3. 或者还有其他的东西std可以将一组字符串减少为一个唯一的集合,但不排序吗?

谢谢!

Cas*_*Cow 6

最简单的方法是保留2个集合,vectorset(或unordered_set).这将消耗更多内存,但将使用它set来检查重复项(O(log N)及时)和vector维护顺序.

set也可以替代地包含在该项目的矢量的位置,并且具有作为断言v[i] < v[j].稍微复杂,因为您需要在特殊谓词中存储向量/指针.但是它可以完成并且将使用可能更少的内存,因为您只有一个字符串集合而另一个是int.此外,它充当索引,能够快速定位特定项目的位置.