stl-set

目录

目录

内部自动有序、不含重复元素

关于能不能自己造一个cmp,还挺复杂。

 

访问:只能用迭代器且受限 

添加元素:没有pushback,用insert

复杂度:ologn

​编辑

查找元素find():返回迭代器 

判断元素有无 

删除:st.erase() 

用迭代器删除

点删除

区间删除

​编辑

直接给值

清空.clear()

元素个数。size() 

 拓展:mutiset不去重,unordered_set不排序

​编辑



内部自动有序、不含重复元素

关于能不能自己造一个cmp,还挺复杂。

在C++中,set 是一种基于红黑树实现的容器,它可以自动对元素进行排序。在C++98和C++03标准中,你可以通过传递一个比较函数或者比较对象来自定义set的排序规则。但是,从C++17开始,标准库中已经不再支持使用函数指针作为比较函数,你必须使用函数对象或者lambda表达式。

以下是在C++98/C++03标准中自定义set的比较函数的示例:

cpp
复制
#include <set>
#include <iostream>

struct CustomCompare {
    bool operator()(const int& lhs, const int& rhs) const {
        // 自定义比较规则,例如:按绝对值大小比较
        return abs(lhs) < abs(rhs);
    }
};

int main() {
    std::set<int, CustomCompare> mySet;

    mySet.insert(-10);
    mySet.insert(5);
    mySet.insert(-20);
    mySet.insert(15);

    for (const int& i : mySet) {
        std::cout << i << ' ';
    }

    return 0;
}
在C++11及以后的版本中,你可以使用lambda表达式来自定义比较规则:

cpp
复制
#include <set>
#include <iostream>

int main() {
    // 使用lambda表达式自定义比较规则
    auto customCompare = [](const int& lhs, const int& rhs) {
        return abs(lhs) < abs(rhs);
    };

    std::set<int, decltype(customCompare)> mySet(customCompare);

    mySet.insert(-10);
    mySet.insert(5);
    mySet.insert(-20);
    mySet.insert(15);

    for (const int& i : mySet) {
        std::cout << i << ' ';
    }

    return 0;
}
在这两个示例中,set容器都会根据自定义的比较规则对元素进行排序。在第一个例子中,我们定义了一个struct来作为比较函数对象,而在第二个例子中,我们使用了lambda表达式。在这两种情况下,比较函数决定了set中的元素顺序。

 

访问:只能用迭代器且受限 

添加元素:没有pushback,用insert

用法:St.insert(x);

x是待插入的数字

复杂度:ologn

写了个实例

查找元素find():返回迭代器 

让他查找的元素不存在是这样的:都返回3

其实不是。返回的是指向st。end()迭代器

所以,

判断元素有无 

使用st.find(元素)==st.end() 

删除:st.erase() 

添加都是给值就行,删除需要迭代器(这个例外)

用迭代器删除

点删除

不存在的值不能删,如果让他删除.end迭代器就会出错

不然就好了 

区间删除

这个不能使用it+2云云

但可以使用++

直接给值

这个可以给一个不存在的元素,他不删就行了。 

清空.clear()

元素个数。size() 

 拓展:mutiset不去重,unordered_set不排序

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值