Это возможный использовать станд.:: next_permutation () для перестановки элементов вектора класса я создал?
Как делает параметр сравнения в next_permutation () работа?
Можно ли использовать std :: next_permutation () для перестановки элементов вектора созданного мной класса?
Да!
Попробуйте это
#include<iostream>
#include<vector>
#include<algorithm>
int main()
{
typedef std::vector<int> V; //<or_any_class>
V v;
for(int i=1;i<=5;++i)
v.push_back(i*10);
do{
std::cout<<v[0]<<" "<<v[1]<<" "<<v[2]<<" "<<v[3]<<" "<<v[4]<<std::endl;;
}
while(std::next_permutation(v.begin(),v.end()));
}
Как работает параметр сравнения в next_permutation ()?
Это может помочь
Да, самый простой способ - переопределить operator <в вашем классе, и в этом случае вам не нужно беспокоиться о comp.
Параметр comp - это указатель на функцию, который принимает два итератора к вектору и возвращает истину или ложь в зависимости от того, как вы хотите, чтобы они упорядочивались.
Изменить: Не проверено, но того, чего стоит:
class myclass
{
public:
myclass() : m_a( 0 ){}
void operator = ( int a ) { m_a = a; }
private:
friend bool operator<( const myclass& lhs, const myclass& rhs ) { return lhs.m_a < rhs.m_a; }
int m_a;
};
int _tmain(int argc, _TCHAR* argv[])
{
myclass c;
std::vector<myclass> vec;
for( int i = 0; i < 10; ++i )
{
c = i;
vec.push_back( c );
}
//these two should perform the same given the same input vector
std::next_permutation( vec.begin(), vec.end() );
std::next_permutation( vec.begin(), vec.end(), &operator< );
return 0;
}
Конечно; вам просто нужно передать итератор первому элементу и один - последнему элементу, как обычно с алгоритмами STL.
Это функтор, используемый для сравнения элементов вашего вектора (или контейнера в целом); он должен вести себя так же, как любой оператор <: вернуть true, если первый элемент меньше второго, и false в противном случае, тем самым устанавливая отношение порядка между вашими объектами. Обратите внимание, что, как и все операторы сравнения, он должен следовать некоторым правилам ( здесь объяснены в немного другом контексте, но они всегда одинаковы).
Между прочим, если вы определяете оператор <для своего класса, вы можете просто использовать первую перегрузку (ту, которая содержит только итераторы в качестве параметров) и избежать создания отдельного функтора.