注:set在C++中是自动排序且不重复的(但在python中set是无序且不重复的)
// Set 基础语法
std::set aSet; // 初始化
aSet.insert(2); // 插入
aSet.insert(2); // 插入
aSet.insert(3); // 插入
aSet.insert(4); // 插入
aSet.insert(6); // 插入
aSet.insert(1); // 插入
aSet.insert(999); // 插入
aSet.erase(1); // 擦除 (擦除不存在的元素不会引起报错)
aSet.erase(888); // 擦除 (擦除不存在的元素不会引起报错)
/************************************/
// Set 遍历输出
set::iterator it; // 构造一个迭代器
for (it = aSet.begin(); it != aSet.end(); ++it)
{
cout << *it << endl;
cout << "-----" << endl;
}
/************************************/
// Set 遍历输出 集合中某个元素和它后面的一个元素
set::iterator it2; // 构造一个新迭代器
set::iterator last_but_one = std::prev(aSet.end()); // 获取指向最后一个元素前面一个元素的迭代器
for (it2= aSet.begin(); it2 != last_but_one; ++it2)
{
cout << *it2 << endl;
cout << *std::next(it2) << endl;
cout << "---" << endl;
}
原因:由于set是自动排序的,因此当构造一个由Point组成的set时,需要告诉编译器,Point之间应以何种方式比较大小
// 定义一个结构体 告诉编译器如何比较Point之间的大小关系
// 它可以放在任意位置, 只要构造set时能看到它即可
struct ComparePoints {
bool operator()(const cv::Point& lhs, const cv::Point& rhs) const {
if (lhs.x < rhs.x) {
return true;
}
else if (lhs.x == rhs.x && lhs.y < rhs.y) {
return true;
}
else {
return false;
}
}
};
// 初始化Set
std::set pointsSet;
// 添加点
cv::Point point1(1, 2);
cv::Point point2(3, 4);
cv::Point point3(5, 4);
pointsSet.insert(point1);
pointsSet.insert(point2);
pointsSet.insert(point3);
// 遍历点集合
for (auto& point : pointsSet) {
std::cout << "(" << point.x << ", " << point.y << ")" << std::endl;
}
// ******************* 方法1 *******************//
vector vecInts {1, 2, 3, 4, 4, 2, 0};
std::set setInts(vecInts.begin(), vecInts.end());
// ******************* 方法2 *******************//
void vecInts2setInts(const vector& vecInts, set& setInts)
{
setInts.clear();
for (const int& data: vecIns) {
setInts.insert(data);
}
}
// ******************* 方法1 *******************//
struct ComparePoints {
bool operator()(const cv::Point& lhs, const cv::Point& rhs) const {
if (lhs.x < rhs.x) {
return true;
}
else if (lhs.x == rhs.x && lhs.y < rhs.y) {
return true;
}
else {
return false;
}
}
};
vector vecPoints {cv::Point(1,1),cv::Point(2,2),cv::Point(2,3),cv::Point(2,3)};
std::set setPoints(vecPoints.begin(), vecPoints.end());
// ******************* 方法2 *******************//
struct ComparePoints {
bool operator()(const cv::Point& lhs, const cv::Point& rhs) const {
if (lhs.x < rhs.x) {
return true;
}
else if (lhs.x == rhs.x && lhs.y < rhs.y) {
return true;
}
else {
return false;
}
}
};
void vecPoints2setPoints(const vector& vecPoints, set& setPoints)
{
// 清空输出参数 setPoints
setPoints.clear();
// 将 vector 中的元素逐个插入到 set 中
for (const cv::Point& point : vecPoints) {
setPoints.insert(point);
}
}
set getIntsIntersect(const set& set1, const set& set2)
{
std::set intersection;
std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(intersection, intersection.begin()));
return intersection;
}
set getPointsIntersect(const set& setPoints1, const set& setPoints2)
{
std::set intersection;
std::set_intersection(setPoints1.begin(), setPoints1.end(), setPoints2.begin(), setPoints2.end(), std::inserter(intersection, intersection.begin()), ComparePoints());
return intersection;
}