标准模板库 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值