删除列表CPP中的重复项

时间:2016-02-19 08:36:10

标签: c++ algorithm list vector

我正在构建一个结构列表,但我不知道如何杀死重复的元素。 - 这里的结构是Point {x,y}。 对于主程序,我提出了一些样本点。我预期的结果是 1 2,0 2 1,3 3,3 5,4 5(删除重复0 2)

struct Point{
   int x;
   int y;
   Point(int inX, int inY) : x(inX), y(inY) {}
};

int main() 
{
  list<Point> mst;
  Point temp(0, 2);
  mst.push_back(temp);

  Point temp2(1, 2);
  mst.push_back(temp2);

  Point temp3(0, 2);
  mst.push_back(temp3);

  Point temp4(1, 3);
  mst.push_back(temp4);

  Point temp5(3, 5);
  mst.push_back(temp5);

  Point temp6(4, 5);
  mst.push_back(temp6);

  for (list<Point>::iterator out = mst.begin(); out != mst.end();++out) { 
     cout << (*out).x << " " << (*out).y << endl;     
  }


// kill duplicate (I DONT KNOW HOW)

  for (list<Point>::iterator out = mst.begin(); out != mst.end();++out) { 
      cout << (*out).x << " " << (*out).y << endl;    
  }
  return 0;
}

`

1 个答案:

答案 0 :(得分:0)

我们初学者应该互相帮助我们不应该吗?:)

实现目标的方法有三种,即列表没有重复。

第一个是只有在列表中没有值的元素时才在列表中插入新值。

第二个是对列表进行排序并应用唯一的方法。

第三个是使用两个循环。

最好为Point类定义operator ==

下面是一个演示程序,显示了第三种和第二种方法。我使用了你的符号,并假设你不能使用C ++ 2011。

#include <iostream>
#include <list>
#include <iterator>

struct Point
{
    int x;
    int y;
    Point(int inX, int inY) : x(inX), y(inY) {}
};

bool operator ==( const Point &a, const Point &b )
{
    return a.x == b.x && a.y == b.y;
}

bool operator <( const Point &a, const Point &b )
{
    return a.x < b.x || (  !( b.x < a.x ) && a.y < b.y );
}

int main() 
{
{    
    std::list<Point> mst;
    Point temp(0, 2);
    mst.push_back(temp);

    Point temp2(1, 2);
    mst.push_back(temp2);

    Point temp3(0, 2);
    mst.push_back(temp3);

    Point temp4(1, 3);
    mst.push_back(temp4);

    Point temp5(3, 5);
    mst.push_back(temp5);

    Point temp6(4, 5);
    mst.push_back(temp6);

    for ( std::list<Point>::iterator out = mst.begin(); out != mst.end(); ++out ) 
    { 
        std::cout << (*out).x << " " << (*out).y << std::endl;     
    }
    std::cout << std::endl;

    for ( std::list<Point>::iterator out = mst.begin(); out != mst.end(); ++out ) 
    {
        std::list<Point>::iterator in = out;

        for ( std::advance( in, 1 ); in != mst.end(); )
        {
            if ( ( *in ).x == ( *out ).x && ( *in ).y == ( *out ).y )
            {
                in = mst.erase( in );
            }
            else
            {
                std::advance( in, 1 );
            }
        } 
    }        

    for ( std::list<Point>::iterator out = mst.begin(); out != mst.end(); ++out ) 
    { 
        std::cout << (*out).x << " " << (*out).y << std::endl;     
    }
    std::cout << std::endl;
}

{    
    std::list<Point> mst;
    Point temp(0, 2);
    mst.push_back(temp);

    Point temp2(1, 2);
    mst.push_back(temp2);

    Point temp3(0, 2);
    mst.push_back(temp3);

    Point temp4(1, 3);
    mst.push_back(temp4);

    Point temp5(3, 5);
    mst.push_back(temp5);

    Point temp6(4, 5);
    mst.push_back(temp6);

    for ( std::list<Point>::iterator out = mst.begin(); out != mst.end(); ++out ) 
    { 
        std::cout << (*out).x << " " << (*out).y << std::endl;     
    }
    std::cout << std::endl;


    mst.sort();
    mst.unique( operator == );

    for ( std::list<Point>::iterator out = mst.begin(); out != mst.end(); ++out ) 
    { 
        std::cout << (*out).x << " " << (*out).y << std::endl;     
    }
    std::cout << std::endl;
}

    return 0;
}

程序输出

0 2
1 2
0 2
1 3
3 5
4 5

0 2
1 2
1 3
3 5
4 5

0 2
1 2
0 2
1 3
3 5
4 5

0 2
1 2
1 3
3 5
4 5