【问题标题】:Remove Duplicate Entries in a C++ Vector删除 C++ 向量中的重复条目
【发布时间】:2013-05-04 18:35:13
【问题描述】:

只想删除重复项。池是vector<pair<string, int>>,但我似乎以某种方式错过了向量开头的一些元素。任何人都可以验证删除的逻辑吗?谢谢:)

Pool Master::eliminateDuplicates(Pool generation)
{
    for(int i = 0; i < generation.size(); i++)
    {
        string current = generation.at(i).first;

        for(int j = i; j < generation.size(); j++)
        {
            if(j == i)
            {
                continue;
            }
            else
            {
                string temp = generation.at(j).first;
                if(current.compare(temp) == 0)
                {
                    Pool::iterator iter = generation.begin() + j;
                    generation.erase(iter);
                }
            }
        }
    }

    return generation;
}

【问题讨论】:

  • 你介意它是否被排序?
  • 一种更简单(并且可能比目前采用的O(n^2) 方式更快的方式)是将所有元素添加到std::set,然后返回到std::vector。跨度>
  • 另外,我假设你的意思是 Poolvector&lt;pair&lt;string, int&gt;&gt;?
  • 我认为集合只能基于整数数据类型工作?我正在比较字符串重复项。编辑是的,对不起错字;)
  • 这个语句 if(j == i){continue;} 有必要吗?你可以从 i+1 开始循环。

标签: c++ vector duplicate-removal erase


【解决方案1】:

如果您不介意对向量进行排序,则可以使用std::unique。那将是 O(Nlog(N))

#include <iostream>
#include <algorithm>
#include <vector>

int main() 
{
    std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};
    std::sort(v.begin(), v.end()); 
    auto last = std::unique(v.begin(), v.end());
    v.erase(last, v.end());
    for (const auto& i : v)
      std::cout << i << " ";
    std::cout << "\n";
}

【讨论】:

  • +1 应该有人为所有面包和黄油矢量用法编写一个 wiki / FAQ 条目。
  • @rhalbersma,所以应该维护一个关于热门话题的最常见问题的列表,比如十大 C++ 问题之类的。那会很方便。 :D
  • 我想知道为什么在所有关于使用 std::unique 的答案中似乎没有人值得一提 unique 不考虑最后一个元素。
  • @tomi.lee.jones 因为所有标准库算法都在开放范围内工作,通常我们通过 begin, end,以这种方式开放。
  • 如果你要排序,为什么不std::sort
【解决方案2】:

这是一个很常见的问题。

因为在你删除一个元素后,由于 for 循环中的 j++,j 指向的位置会跳过一个元素。 根据您的代码解决问题的最简单解决方案是在 generation.erase(iter) 之后添加 j--:

  generation.erase(iter);
  j--;

【讨论】:

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