标准模板库 STL—— set 列传

STL 中的容器们

标准模板库(STL)之 vector 列传

  • set/multiset 通常以红黑树(red-black tree)实现。红黑树在改变元素数量和元素搜索方面都很出色,它保证节点安插时最多只会做两个重新链接(relink)的动作,而且到达某一元素的最长路径的深度,至多只是最短路径的深度的两倍。

创建 set 容器对象时,指定排序规则(sorting criterion)

set (模板容器类)的第二个模板参数标识:排序规则(一般为仿函数

class Person
{
public:
    std::string firstname() const;
    std::string lastname() const;
    ...
}

class PersonSortingCriterion
{
public:
    bool operator()(const Person& left, const Person& right) const
    {
        return left.lastname() < right.lastname() || 
            (left.lastname() == right.lastname() && left.firstname() < right.firstname());
    }
};
int main(int, char**)
{
    std::set<Person, PersonSortingCriterion> coll;
    ...
    return 0;
}

常见成员函数

  • (1)插入(insert)

    set 提供如下接口:

    pair<iterator, bool> insert(const value_type& val);
    iterator insert(const_iterator posHint, const value_type& val);
                    // 注意两者返回值的区别
    • pair 结构的 second 成员表示安插是否成功
    • pair 结构的 first 成员表示新元素的位置,或现存的同值元素的位置。
    std::set<double> s;
    if (s.insert(3.3).second)
    { ... }
    else 
    { ... }

    如果还想处理新位置或旧位置,此时就需要有保存 insert() 的返回值了:

    auto status = s.insert(value);
    if (status.second)
        std::cout << value << " inserted as element ";
    else
        std::cout << value << " already exists as element ";
    std::cout << std::distance(s.begin(), status.first)+1 << std::endl;

你可能感兴趣的:(标准模板库 STL—— set 列传)