【问题标题】:Delete common objects in two vectors/get duplicate objects in a vector (NOT erase)删除两个向量中的公共对象/获取向量中的重复对象(不擦除)
【发布时间】:2015-05-16 22:52:06
【问题描述】:

我正在使用 SDL 2 制作游戏。该游戏将具有可自定义的控件。但是,如果一个键绑定到多个功能/任务,则应在所有情况下突出显示该键,以通知用户该键已重复。我正在寻找最简单的方法来找到重复的键。

我的想法是将向量转换为集合并返回,使其唯一,然后从原始向量中删除所有唯一值。然后我的问题就变成了,有没有比单独删除每个对象更简单的方法来从与另一个向量共有的向量中删除?就像(ab 是向量)a.remove(b.begin(), b.end())?

OR,有没有更简单的方法来获取向量中重复的对象?

澄清一下,我想从[d, e, a, a, g, f, c, f, f] 得到[a, f]。我想要唯一对象的向量[a, c, d, e, f, g]。我也知道我可以通过多次遍历向量来做到这一点,我只想要更简单的方法,如果有的话。

如果您需要任何代码(没有太多可提供的),请告诉我,提前致谢!

【问题讨论】:

  • 您总是可以通过使用 两个 容器来解决这个问题,一个用于实际映射,另一个用于跟踪键绑定计数。

标签: c++ vector duplicates


【解决方案1】:

获取向量的所有重复元素是一项代价高昂的操作(您必须在向量的所有其余部分中对每个向量元素进行迭代)并且不会是一种“简单”的方法(谈论迭代) 但转换成一个集合并返回似乎不是一个好的选择。

我能想到的选项:

  1. 尝试从一开始就使用集合(或映射),这些似乎是解决您的控件问题的好选择,如果您不希望它们有序(因为集合和映射是),请检查 unordered_map 或unordered_set,这将允许您存储无序的元素而不重复

  2. 如果您需要向量,比检查所有向量更好的选择是在每次存储元素时检查(不会好很多,但至少更干净)

  3. 用向量存储一组使用过的元素,每次你在向量中插入任何控件时,也会插入到集合中,这样你每次都可以轻松检查控件是否已分配(你会消耗更多内存,但不必每次都创建一个新集)

可能还有其他选择,但我找不到解决此问题的“完美”方法,因为这取决于您对结构的需求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多