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<Eigen::Vector3i, FunVector3i, Eigen::aligned_allocator<Eigen::Vector3i>> AllVector3i;
//向set中插入一个新的数据
Eigen::Vector3i OneNewVector3i;
//auto 数据类型是一个std::pair<迭代器,bool>
auto IsHad = AllVector3i.insert(OneNewVector3i);
if (IsHad.second)
{
	std::cout<<"插入成功,之前没有相同的元素存在。";  
}
else
{
	std::cout<<"插入失败,有相同的元素存在。";  
}

问题:
之前不知道哪个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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值