Delete shared objects from two vectors?

Let's say I have vector<class1a>,vector<class1b>how to remove shared objects from both of them. I defined the == operator for objects class1 class1a, class1b

+5
source share
6 answers

stl algorithms provide several functions for performing operations on sets, in particular, calculating the symmetric difference of sets that you need.

Here is a usage example:

#include <algorithm>
#include <vector>

int main(int argc, char **argv) {

    std::vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    v1.push_back(5);
    v1.push_back(6);

    std::vector<int> v2;
    v2.push_back(2);
    v2.push_back(4);
    v2.push_back(6);
    v2.push_back(8);

    // Ranges must be sorted!
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::vector<int> res; // Will contain the symmetric difference
    std::set_symmetric_difference(v1.begin(), v1.end(), 
                                  v2.begin(), v2.end(), 
                                  std::back_inserter(res));

    // Copy result to the output
    std::copy(res.begin(), res.end(), std::ostream_iterator<int>(cout, " "));
    // Prints "1 3 5"

    return 0;
}

std::set_symmetric_differenceaccepts two ranges (i.e. two pairs of OutputIterator) and InputIterator into which it places the result. It also returns an iterator to the end of the range of results.


EDIT

. , std::set_difference:

vector<int>::iterator endRange;
endRange = set_difference(v1.begin(), v1.end(), 
                          v2.begin(), v2.end(), 
                          v1.begin());
v1.erase(endRange, v1.end());

v1 - v2 v1. , , v1 . , v1 v2, std::set_intersection:

vector<int> inter;
set_intersection(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 back_inserter(inter));
// inter is "2 4 6"

v1.erase(set_difference(v1.begin(), v1.end(),
                        inter.begin(), inter.end(),
                        v1.begin()),
         v1.end());
// v1 is "1 3 5"

v2.erase(set_difference(v2.begin(), v2.end(),
                        inter.begin(), inter.end(),
                        v2.begin()),
         v2.end());
// v2 is "8"

, , , STL.

+8

stl- "set_symmetric_difference", , .

, .

msdn

+1

2 , , . , .

0

, n ^ 2, . n ^ 2, .

, , , , .

0

class1a class1b , . . . , - .

0

Set. equals 1 class2, , , . equals , , ==, false. equals.

0

All Articles