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;
}
};