#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template<typename T>
typename vector<T>::const_iterator FindFirstDuplicate( const vector<T>& v )
{
vector<T> nv;
nv.reserve( v.size() );
for( auto it1 = v.cbegin(); it1 != v.cend(); ++it1 ) // can be const (?)
{
auto it2 = find( nv.cbegin(), nv.cend(), *it1 ); // search elem in new vector
if( it2 == nv.cend() ) // if not present,
nv.push_back( *it1 ); // add in new vector
else // else, means we found a dupe
return v.begin() + ( it2 - nv.cbegin() );
}
return v.begin();
}
int main() {
vector<int> v = { 1,2,3,4,5,6,7,8,9,10,3,11 };
auto it = FindFirstDuplicate(v);
cout << "first dupe is " << *it << " at " << it - v.cbegin() << endl;
std::rotate( v.begin(), it, v.end() ) ;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0eXBlbmFtZSB2ZWN0b3I8VD46OmNvbnN0X2l0ZXJhdG9yIEZpbmRGaXJzdER1cGxpY2F0ZSggY29uc3QgdmVjdG9yPFQ+JiB2ICkKewoJdmVjdG9yPFQ+IG52OwoJbnYucmVzZXJ2ZSggdi5zaXplKCkgKTsKCWZvciggYXV0byBpdDEgPSB2LmNiZWdpbigpOyBpdDEgIT0gdi5jZW5kKCk7ICsraXQxICkgLy8gY2FuIGJlIGNvbnN0ICg/KQoJewoJCWF1dG8gaXQyID0gZmluZCggbnYuY2JlZ2luKCksIG52LmNlbmQoKSwgKml0MSApOyAvLyBzZWFyY2ggZWxlbSBpbiBuZXcgdmVjdG9yCgkJaWYoIGl0MiA9PSBudi5jZW5kKCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IHByZXNlbnQsCgkJCW52LnB1c2hfYmFjayggKml0MSApOyAgICAgICAgICAgICAgICAgICAgICAvLyAgYWRkIGluIG5ldyB2ZWN0b3IKCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgbWVhbnMgd2UgZm91bmQgYSBkdXBlCgkJCXJldHVybiB2LmJlZ2luKCkgKyAoIGl0MiAtIG52LmNiZWdpbigpICk7Cgl9CglyZXR1cm4gdi5iZWdpbigpOwp9CgppbnQgbWFpbigpIHsKCQoJdmVjdG9yPGludD4gdiA9IHsgMSwyLDMsNCw1LDYsNyw4LDksMTAsMywxMSB9OwoJYXV0byBpdCA9IEZpbmRGaXJzdER1cGxpY2F0ZSh2KTsKCWNvdXQgPDwgImZpcnN0IGR1cGUgaXMgIiA8PCAqaXQgPDwgIiBhdCAiIDw8IGl0IC0gdi5jYmVnaW4oKSA8PCBlbmRsOwoKCXN0ZDo6cm90YXRlKCB2LmJlZ2luKCksIGl0LCB2LmVuZCgpICkJOwoJcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:29:38: error: no matching function for call to ‘rotate(std::vector<int>::iterator, __gnu_cxx::__normal_iterator<const int*, std::vector<int> >&, std::vector<int>::iterator)’
std::rotate( v.begin(), it, v.end() ) ;
^
prog.cpp:29:38: note: candidate is:
In file included from /usr/include/c++/4.8/algorithm:62:0,
from prog.cpp:3:
/usr/include/c++/4.8/bits/stl_algo.h:1699:5: note: template<class _FIter> void std::rotate(_FIter, _FIter, _FIter)
rotate(_ForwardIterator __first, _ForwardIterator __middle,
^
/usr/include/c++/4.8/bits/stl_algo.h:1699:5: note: template argument deduction/substitution failed:
prog.cpp:29:38: note: deduced conflicting types for parameter ‘_FIter’ (‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ and ‘__gnu_cxx::__normal_iterator<const int*, std::vector<int> >’)
std::rotate( v.begin(), it, v.end() ) ;
^