How to sort an STL vector?

前端 未结 5 2268
借酒劲吻你
借酒劲吻你 2020-12-04 10:44

I would like to sort a vector

vector object;

Where myclass contains many int variabl

5条回答
  •  不思量自难忘°
    2020-12-04 11:25

    A pointer-to-member allows you to write a single comparator, which can work with any data member of your class:

    #include 
    #include 
    #include 
    #include 
    
    template 
    struct CompareByMember {
        // This is a pointer-to-member, it represents a member of class T
        // The data member has type U
        U T::*field;
        CompareByMember(U T::*f) : field(f) {}
        bool operator()(const T &lhs, const T &rhs) {
            return lhs.*field < rhs.*field;
        }
    };
    
    struct Test {
        int a;
        int b;
        std::string c;
        Test(int a, int b, std::string c) : a(a), b(b), c(c) {}
    };
    
    // for convenience, this just lets us print out a Test object
    std::ostream &operator<<(std::ostream &o, const Test &t) {
        return o << t.c;
    }
    
    int main() {
        std::vector vec;
        vec.push_back(Test(1, 10, "y"));
        vec.push_back(Test(2, 9, "x"));
    
        // sort on the string field
        std::sort(vec.begin(), vec.end(), 
            CompareByMember(&Test::c));
        std::cout << "sorted by string field, c: ";
        std::cout << vec[0] << " " << vec[1] << "\n";
    
        // sort on the first integer field
        std::sort(vec.begin(), vec.end(), 
            CompareByMember(&Test::a));
        std::cout << "sorted by integer field, a: ";
        std::cout << vec[0] << " " << vec[1] << "\n";
    
        // sort on the second integer field
        std::sort(vec.begin(), vec.end(), 
            CompareByMember(&Test::b));
        std::cout << "sorted by integer field, b: ";
        std::cout << vec[0] << " " << vec[1] << "\n";
    }
    

    Output:

    sorted by string field, c: x y
    sorted by integer field, a: y x
    sorted by integer field, b: x y
    

提交回复
热议问题