-2

假设我有一个 vector 的整数向量vector<vector<int >v1。我正在尝试删除具有相同元素的相同行。如

before    after
--v1--   --v1'--
 1324     1324
 1324     2435
 2435
 2435

任务是删除重复的行。这是一个非常简单的算法,但我需要 C++ 版本??

for (int i = 0; i < v1.size(); i++)
      {
         for (int j = 1; j < v1.size() ; j++ )
            {
               for (int a=0; v1[i][a] == v1 [j][a]; a++)  
               {
                   if (a=v1.end());
                   {
                    //erase(the row);                    

                   } 
               }


            }
       }
4

2 回答 2

2

如果外部向量已排序,则可以使用标准算法 std::unique 例如

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

如果内部向量也已排序,我想附加它。否则,您应该使用相同的算法 std::unique 和一个谓词,该谓词将在比较它们之前对内部向量进行排序。

于 2013-10-20T22:16:03.247 回答
0

根据我对您的问题的理解,您有一个二维数组,并且您想删除具有相等列的行:

vector<vector<int>> v1
{
    {1, 1},   // Should be removed
    {2, 7},
    {3, 3},   // Should be removed
    {4},
    {5, 5, 5} // Should be removed
};

for (auto r = v1.begin(); r != v1.end(); )
{
    if (r->size() < 2)
        continue;

    auto k = r->front();

    bool equal = all_of(r->begin(), r->end(), [&k](int x)
    {
        return x==k;
    });

    if (equal)
        r = v1.erase(r);
    else
        ++r;
}

实时代码


   before        after
 ----v1---     ---v1'---
 {1,3,2,4}     {1,3,2,4}
 {1,3,2,4}     {2,4,3,5}
 {2,4,3,5}
 {2,4,3,5}

阅读您的评论,最好如上所示显示您的表格,以免误导该问题。所以在这种情况下你可以使用unique函数:

v1.erase(unique(v1.begin(), v1.end()), v1.end());
于 2013-10-20T22:20:48.470 回答