Erasing an element from a C ++ 2D vector

I have an asymmetric vector in 2D.

vector< vector<int> > Test

where Test =

         2 4 6 5 7 
         6 5 7 9 10
         5 9 10
         9 10

I am reading line 1, and if any of its element is present in other lines, delete it. for eaxmple .. After reading line 1, I need to remove 6, 5 and 7 from other lines.

However it does not work

Here is the code I'm trying

Test[i].erase(Test[i].begin()+j);

where i = string and j - col.

My code is:

for (i =0; i < Test.size();i++)
        {
        for (j=0; j < Test[i].size();j++)
                {
                // removed repeated element
                if (i >0)
                        {
                        Test[i].erase(Test[i].begin() +j);
                        }
                }
        }
+4
source share
5 answers

It may not be very nice, but it works

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

int main() 
{
    std::vector<std::vector<int>> v =
    {
        { 2, 4, 6, 5, 7 }, 
        { 6, 5, 7, 9, 10 },
        { 5, 9, 10 },
        { 9, 10 }
    };

    for ( const auto &row : v )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    if ( !v.empty() )
    {
        for ( auto it = std::next( v.begin() ); it != v.end(); ++it )
        {
            auto is_present = [&]( int x )
            {
                return std::find_if( v.begin(), it,
                    [x]( const std::vector<int> &v1 )
                    {
                        return std::find( v1.begin(), v1.end(), x ) != v1.end();
                    } ) != it; 
            };

            it->erase( std::remove_if( it->begin(), it->end(), is_present ), 
                       it->end() );
        }
    }


    for ( const auto &row : v )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

Output signal

2 4 6 5 7 
6 5 7 9 10 
5 9 10 
9 10 

2 4 6 5 7 
9 10 
+1
source

, Test[i].begin()+j? Is ist , ? . , , , .

, , :

for(int j = 0; j < Test.size(); j++){            //iterate over other rows
    if(j == i)
        continue;
    for(int k = 0; k < Test[j].size(); k++){     //iterate over elements of the rows
        int elementToRemove = (Test[j])[k];
        vector<int>::iterator it = Test[i].begin();
        while (it != Test[i].end()) {            //iterate over row i
           if((*it) == elementToRemove){         //erase the element if it matches the actual
               it = Test[i].erase(it);    
           }else{
               it++;
           }
        }
    }
}

i. , i = 0 to n. , ,

for (i =0; i < Test.size();i++){
    //my code here...
}

: . .

Edit2: continue.

+1

, , . :

void RemoveRowDuplicates(vector<vector<int>> &v)
{
    std::set<int> vals;

    for(auto &vec : v)
    {
        vec.erase(remove_if(vec.begin(), vec.end(), [&](int k){
            return vals.find(k) != vals.end();
        }), vec.end());
        vals.insert(vec.begin(), vec.end());
    }
}
+1

:

int i = 0;
for ( int j = i+1; j < Test.size(); ++j )
{
   for ( int k = 0; k < Test[i].size(); ++k )
   {
      std::vector<int>::iterator iter = Test[j].begin();
      std::vector<int>::iterator end = Test[j].end();
      for ( ; iter != end; )
      {
         if ( *iter == Test[i][k] )
         {
            iter = Test[j].erase(iter);
         }
         else
         {
            ++iter;
         }
      }
   }
}
0

2D-

myVector =

1 2 3 4 5 -6

6 7 8 -9

8 -1 -2 1 0

, myVector [row] [column] .

:

void delete_element(vector<int>& temp, col) 
  {
     temp.erase(temp.begin()+col);
  }

int main()
 {
  //Assume that the vector 'myVector' is already present.
    cin>>row>>column;
    delete_element(myVector[row],column);
 } 

, . , 2D- , (, , ), . , - ('&' ). , 1D-.

, !

0

Source: https://habr.com/ru/post/1546054/


All Articles