views:

99

answers:

2

I hope this is not a duplicate question, but if it is, feel free to point me in the right direction.

I have a vector<vector<int> >.

Is it possible to use unique() on this? Something like:

vector<vector<int> > myvec;
//blah blah do something to myvec
vector<vector<int> >::interator it = unique(myvec.begin(), myvec.end());

Would the range myvec.begin() to it be unique?

+2  A: 

Looks like it should work -- it would call the == operator on two vector<int> objects so that should work.

Note that the operator works on groups of duplicates so you may have to sort your outer vector if your duplicates are not grouped already.

Ref: http://www.sgi.com/tech/stl/unique.html

+3  A: 

Yes, as long as your vector is sorted. See unique () STL documentation for details.

Here is an example of usage:

#include <vector>
#include <string>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

int main ()
{
    vector< vector<string> > v;

    v.push_back (vector<string> ());
    v.back ().push_back ("A");

    v.push_back (vector<string> ());
    v.back ().push_back ("A");

    v.push_back (vector<string> ());
    v.back ().push_back ("B");

    for (vector< vector<string> >::iterator it = v.begin (); it != v.end (); ++it)
        for (vector<string>::iterator j = it->begin (), j_end = it->end (); j != j_end; ++j)
            cout << *j << endl;

    cout << "-------" << endl;

    vector< vector<string> >::iterator new_end = unique (v.begin (), v.end ());
    for (vector< vector<string> >::iterator it = v.begin (); it != new_end; ++it)
        for (vector<string>::iterator j = it->begin (), j_end = it->end (); j != j_end; ++j)
            cout << *j << endl;
}
Vlad Lazarenko