• C++ set容器


    set 容 器

    • 有序容器
    • 插入时候排序
    • 插入元素应该具有互异性

    应该具有互异性,但是自己写的排序比较不对可能导致没有互异性。

    使用set存储自定义数据类型

    存储自定义or第三方库的数据类型要提供相关的仿函数提供元素之间的比较排序的方式。仿函数返回的true或者false是可以理解为插入时候与已有元素比较后应该存在前面or后面。
    除了提供仿函数提供比较方式以外,还可以在自定义数据类型中提供bool operator<运算符重载,来提供比较排序的方式。但是这种方式在使用set存储第三方库中数据类型中不太方便,因为第三方库不一定提供了比较运算符号的重载,手动改源码不如直接写一个仿函数

    以存储Eigen::Vector3i为例子

    使用STL容器存储Eigen的数据类型,最好使用其提供的内存分配器,原因参考之前总结的这个文章
    代码:

    //仿函数
    struct FunVector3i
    {
        bool operator()(const Eigen::Vector3i &left, const Eigen::Vector3i &right)
        {
            if (left.x() != right.x())
            {
                return left.x() < right.x();
            }
            else if (left.y() != right.y())
            {
                return left.y() < right.y();
            }
            else
            {
                return left.z() < right.z();
            }
        }
    };
    //存储Eigen::Vector3i数据类型
    //<数据类型,比较仿函数,内存分配器>
    std::set> AllVector3i;
    //向set中插入一个新的数据
    Eigen::Vector3i OneNewVector3i;
    //auto 数据类型是一个std::pair<迭代器,bool>
    auto IsHad = AllVector3i.insert(OneNewVector3i);
    if (IsHad.second)
    {
    	std::cout<<"插入成功,之前没有相同的元素存在。";  
    }
    else
    {
    	std::cout<<"插入失败,有相同的元素存在。";  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    问题:
    之前不知道哪个xx写的误导别人的博客写了如下错误的仿函数,注意下面的代码不能保证set中各个互异。将什么仿函数只有能够提供判断set中存在相同的元素返回false就可以了原话:“只要你的比较方法能够满足对相等元素永远返回false就满足要求了”
    以上划掉的话纯属瞎扯,仿函数必须需要提供正确且唯一的排序方式。只判断是否相同不能保证互异性。

    //仿函数
    struct FunVector3i
    {
        bool operator()(const Eigen::Vector3i &left, const Eigen::Vector3i &right)
        {
            if (left.x() < right.x())
            {
                return true;
            }
            if (left.y() < right.y())
            {
                return true;
            }
            if (left.z() < right.z())
            {
                return true;
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    C++之weak_ptr与shared_ptr智能指针实例(一百九十五)
    C++Primer 16.1定义模板 习题总结
    PHP简单实现预定义钩子和自定义钩子
    SpringMvc第六战-【SpringMvcJSON返回&异常处理机制】
    知识图谱和 LLM:利用 Neo4j 实现大型语言模型
    [MQ] SpringBoot使用扇型(广播)交换机/主题交换机
    Gradle 笔记
    算法技巧之双指针
    微服务架构之演进历程
    【无标题】
  • 原文地址:https://blog.csdn.net/qq_45401419/article/details/128037461