繁体   English   中英

使用next_permutation来排列类的向量

[英]Use next_permutation to permutate a vector of classes

是否可以使用std :: next_permutation()来置换我创建的类的向量元素?

next_permutation()中的compare参数如何工作?

是否可以使用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()中的compare参数如何工作?

可能有所帮助

是的,最简单的方法是在你的类中覆盖operator <,在这种情况下你不需要担心comp。

comp参数是一个函数指针,它将两个迭代器带到向量并返回true或false,具体取决于您希望它们如何排序。

编辑:未经测试但是它的价值:

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;
}
  1. 当然可以; 你需要将迭代器传递给第一个元素,一个传递给后一个元素,就像STL算法一样。

  2. 它是一个用于比较矢量元素(或一般容器)的函子; 它应该像任何<操作符一样运行:如果第一个元素小于第二个元素,则返回true,否则返回false,从而在对象之间建立顺序关系。 请注意,作为所有比较运算符,它必须遵循一些规则( 此处在稍微不同的上下文中进行了解释,但它们始终相同)。

顺便说一下,如果你为你的类定义一个<运算符,你可以简单地使用第一个重载(只有迭代器作为参数的重载),并避免创建一个单独的仿函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM