【问题标题】:C++ Delete Duplicate Entries in a vectorC ++删除向量中的重复条目
【发布时间】:2012-02-20 18:18:19
【问题描述】:

我有一个时间向量,并且有很多地方重复了时间。时间向量只是文本文件中的一列数据,同一个数据文本文件中还有几个其他向量(速度、位置等)。如何根据时间删除重复条目,同时保留所有其他条目?说:

if (time[j] == time[j + 1]
{
    do stuff...
}

我实际上有几个向量,所以我也会从中删除重复的条目。我需要保留其他向量中数据的顺序(它们不一定是连续的。)

我只想删除连续的重复点。

谢谢。

【问题讨论】:

  • 您只想删除连续个重复项还是所有重复项?

标签: c++ std


【解决方案1】:

嗯,一个可爱的方法是使用 std::sort 对向量进行排序,然后你可以使用 std::unique 从向量整个范围(.begin() 到 .end( ))。

您可能会找到一种更有效的方法,但这至少是一种有趣的方法,并且只需要 2 行代码 :)

【讨论】:

  • 我实际上有几个向量,所以我也会从中删除重复的条目。我需要保留其他向量中数据的顺序(它们不一定是连续的。)
【解决方案2】:

正如您所说,重复项彼此跟随,您可以在 erase-remove idiom 上使用此变体,否则您必须先排序(请参阅 std::sortstd::stable_sort

time.erase(std::unique(time.begin(),time.end()),time.end());

【讨论】:

  • @user1187621:您必须包含 <algorithm> 标头。 Afaik 它是一个 pre-c++11 库,所以 VS2010 应该有它(虽然无法验证自己)。
  • 这行得通,除非我在其他向量上使用此方法,否则我最终会删除比时间向量中更多的“重复”数据点。我只想删除连续的重复点。
  • @user1187621 如果没有具体示例,我不知道您对其他数组的确切含义,但是如果您需要仍然链接数据,您应该将它们放在同一个向量中(使用结构,std::tuple 或任何你喜欢的)。此外,如果您不排序,这只会删除连续的重复项...
  • 我不认为我在排序。我将如何使用 STRUCT 执行此操作?
【解决方案3】:

为什么不一开始就避免添加重复项? IE。在将其添加到向量之前检查该项目是否已存在。

【讨论】:

  • 我正在从文本文件中读取数据,而我读取数据的方式并没有真正设置为检查值是否相同。
【解决方案4】:

如果必须保留顺序并且重复不是连续的:

{
    auto i = time.begin()
    std::set<time::value_type> exists;
    while(i != time.end()) {
        if (exists.insert(*i).second == false)  //it's a duplicate:
            i = time.erase(i);
        else //else not a duplicate
            ++i;
    }
}

【讨论】:

    【解决方案5】:

    我最终只是将数据复制到了一个新的向量中,并在此过程中删除了重复的条目。

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 1970-01-01
      • 2011-11-29
      • 2014-08-01
      • 2013-03-09
      • 2015-02-03
      • 2015-09-15
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多