【问题标题】:Use next_permutation to permutate a vector of classes使用 next_permutation 置换类向量
【发布时间】:2011-03-12 05:22:42
【问题描述】:

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

next_permutation() 中的比较参数是如何工作的?

【问题讨论】:

    标签: c++ class vector permutation


    【解决方案1】:

    是的,最简单的方法是在你的类中覆盖 operator

    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;
    }
    

    【讨论】:

    • 不知道,不是我,我什至没有帐户...不过感谢您的回答
    【解决方案2】:
    1. 没问题;您只需将迭代器传递给第一个元素,并将一个迭代器传递给后一个元素,就像 STL 算法一样。

    2. 它是一个函子,用于比较向量(或一般容器)的元素;它应该像任何 here 在上下文中的解释略有不同,但它们始终相同)。

    顺便说一句,如果你为你的类定义了一个

    【讨论】:

      【解决方案3】:

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

      This 可能会有所帮助

      【讨论】:

      • 感谢您的回答,但也许我不够明确。假设我有一个有几个不同属性的类,不一定是 Ints。我是否需要重载类的比较运算符才能置换向量?
      • @PrasoonSaurav,如果存在重复项怎么办? next_permutation() 会自动跳过相同的排列?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多