Posts Tagged ‘unique’

STL unique != MATLAB unique

Monday, March 26th, 2012

Got burned on the STL unique algorithm not actually implementing what I inferred its name to mean. In MATLAB unique is finds unique elements in an unordered set.

``unique([1 2 3 3 2 1]) --> [1 2 3]``

In STL, unique reorders an ordered set so that repeated equal entries are replaced with a single entry:

``unique([1 2 3 3 2 1]) --> [1 2 3 2 1]``

To get the behavior of the matlab unique you’ll need to sort first.

``````#!/bin/bash
/*/../bin/ls > /dev/null
# BEGIN BASH SCRIPT
printf "//" | cat - \$0 | g++ -I/opt/local/include/eigen3 -I\$IGL_LIB/include -o .main -x c++ - && ./.main
rm -f .main
# END BASH SCRIPT
exit
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main(int argc,char * argv[])
{
using namespace std;
vector<int> V;
V.push_back(1);
V.push_back(2);
V.push_back(3);
V.push_back(3);
V.push_back(2);
V.push_back(1);
vector<int> SV = V;

cout<<"V=";
copy(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
cout<<endl;

V.erase(unique(V.begin(), V.end()), V.end());
cout<<"unique(V)=";
copy(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
cout<<endl;

sort(SV.begin(),SV.end());
SV.erase(unique(SV.begin(), SV.end()), SV.end());
cout<<"unique(sort(V))=";
copy(SV.begin(), SV.end(), ostream_iterator<int>(cout, " "));
cout<<endl;

return 0;
}
``````

which produces:

``````
V=1 2 3 3 2 1
unique(V)=1 2 3 2 1
unique(sort(V))=1 2 3
``````