排序和删除不适用于大型矢量的重复项

时间:2014-09-13 17:16:04

标签: c++

我的程序应该从文本文件中读取数字数据(成对),删除重复项,然后在转移到其他内容之前告诉我矢量的大小。我测试了下面的代码并且它适用于具有大约10-20行数据的文件,但是当我在更大的数据集(超过100,000行数值数据)上尝试它时,当我尝试大小时没有输出( );矢量。不确定是什么问题。

while( getline( fs1, instrng ) ) {

    istringstream s1(instrng);
    int a, b;
    s1 >> a >> b;
    pair<int,int> pair1 = make_pair(a,b);
    vec1.push_back( pair1 );

    sort( vec1.begin(), myvec1.end() );
    myvec.erase(unique(myvec.begin(),myvec.end()), myvec.end());

1 个答案:

答案 0 :(得分:1)

在您的上下文中,std::sort()std::unique()的使用正在发挥作用。问题是性能问题。你需要做两件事之一:

  1. 你等了足够长的时间让实现有机会进行大量的排序。
  2. 您将std::sort()std::unique()std::vector<...>::erase()的使用移出了循环。
  3. 换句话说:您设法为O(n * n * log n)创建了一个O(n * log n)实现,其中n是元素的数量。

    顺便说一下,你应该总是验证输入是否成功:你没有检查读取线上的两个整数是否成功。就个人而言,我只会读取原始流中的整数而不使用std::istringstream作为创建和/或设置这些流也会增加不必要的成本。不可否认,这个成本远远低于每个元素的排序。