一、介绍

std::set集合的元素具有顺序性、唯一性等特性,可以指定比较函数进行排序。std::set和std::map一样以红黑树来实现。

set成员函数和非成员函数可以参考:
http://zh.cppreference.com/w/cpp/container/set

二、示例

#include <stdio.h>
#include <set>
#include <memory>

class Car {
public:
    Car(float price) : price_(price) {
    }

    ~Car() {
    }

    float price() const { 
        return price_; 
    }
private:
    float price_;
};

struct CarCmp {
    // 函数需要使用const修饰
    bool operator()(const std::unique_ptr<Car> &l, const std::unique_ptr<Car> &r) const {
        // l是否比r小
        return l->price() < r->price(); // 这里不能用<=,否则插入相同的元素会触发断言
    }
};

int main()
{
    std::set<std::unique_ptr<Car>, CarCmp> car_set;  // 声明+比较器
    typedef std::set<std::unique_ptr<Car>, CarCmp>::iterator CarItr;
    typedef std::set<std::unique_ptr<Car>, CarCmp>::const_iterator CarConstItr;

    // set插入
    car_set.insert(std::unique_ptr<Car>(new Car(10.f)));
    car_set.insert(std::unique_ptr<Car>(new Car(5.f)));
    car_set.insert(std::unique_ptr<Car>(new Car(11.f)));
    car_set.insert(std::unique_ptr<Car>(new Car(11.f)));

    // set遍历
    for (CarItr it = car_set.begin(); it != car_set.end(); it++) {
        printf("price: %.2f\n", (*it)->price());
    }

    // set查找(查找的时候会根据CarCmp来比较)
    CarItr it = car_set.find(std::unique_ptr<Car>(new Car(5.f)));
    if (it != car_set.end()) {
        printf("found\n");
    }

    return 0;
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐