2013-10-20 56 views
-2

假設我有一個向量的整數向量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);      

        } 
       } 


      } 
     } 

回答

2

如果外矢量進行排序則可以使用標準算法的std ::獨特 例如

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

我想追加該條件是內載體也排序。否則,你應該使用相同的std :: unique算法,並在比較它們之前對謂詞進行排序。

+4

在此網站上,我們不回答「給我codez」問題。 – Puppy

+0

如果行長在每一行都發生變化,並且他們沒有排序 – zaratushtra

+0

對不起,我不想問像「給我代碼」這樣的問題。只是一個簡單的方法就足夠了,或者是一個分析解釋。 – zaratushtra

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; 
} 

Live code


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()); 
+0

@M M.您錯過了解該任務正在刪除重複的行。在你的例子中, – zaratushtra

+0

沒有一行是相同的。所以你不需要刪除任何行。讓我們假設你有另一個{1,1},這種情況下,你應該刪除其中一個{1,1} – zaratushtra