STL
概述
最近在做一个东西时用到了一个比较复杂的数据存储方式,说复杂其实主要是自己太菜,对于大佬来说简直一眼就看出来。我最后的目的是实现对两个坐标集合求交集,由于想利用STL实现,因此在前期,我使用了容器去存储各类数据。
数据存储格式
首先需要利用一个结构体去存储点集。其中x,y是坐标,label是点标签。
typedef struct point
{
int x;
int y;
int label;
point()
{
x = -1;
y = -1;
label = -1;
}
} Point;
接着定义一个RegionObject
map<int, vector<Point>> RegionObject;
由于之前没有使用过太过复杂存储结构,再给RegionObject赋值的时候难坏了我(主要是太菜),网上有没有类似结构的赋值参照,于是我就摸索尝试。最后找到了若干种赋值方式。
方式1:利用Point中转一下,然后再vector=vector
//创建一个中转变量
Point temp;
//初始化temp
temp.x = 1;
temp.y = 1;
temp.label = 1;
//创建一个新的vector并利用temp初始化
vector<Point> vec1;
vec1.push_back(temp);
//传值
RegionObject[0]=vec1;
方式2:利用Point中转一下,然后再push_back进去
//创建一个中转变量
Point temp;
//初始化temp
temp.x = 1;
temp.y = 1;
temp.label = 1;
//传值
RegionObject[0].push_back(temp);
后期又想出了其他方式,由于前面代码已经这样写了就没有改。要想搞清楚这些复合容器,前提是对单一容器清楚。
求集合交集
起初我想的是采用set_intersection函数直接求解,但是刚开始我只查到该函数的一个版本就是有五个参数的版本。
set_intersection(vec3.begin(), vec3.end(), vec4.begin(), vec4.end(), inserter(vec, vec.begin()));
就想到,该函数并未说明他按照何种求交集方式去对单一元素求交集,没有判定参数说明调用了默认的比较方式,我猜想是利用“==”判定的,于是在结构体内部定义了一个“==”的运算符重载函数。
bool operator==(point a1){
if(this->x == a1.x && this->y == a1.y) return true;
else return false;
}
接着使用上面那个函数求交集发现有问题,报错中提示到“<”号,因此,我猜想的“==”可能是有点问题的。之后我并没有去深究其源码,而是找到了求交集函数其实是有一个重载版本的,里面可以加入自定义比较函数,于是就自定义了一个cmp函数实现了对坐标类(也可以说是多维矢量)求交集的功能。
具体实现
其实他的具体实现比下面复杂得多,这里是我简化后的东西。
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstring>
#include <numeric>
#include <map>
using namespace std;
typedef struct a
{
int x;
int y;
a()
{
x = 0;
y = 0;
}
} aaa;
bool cmp(aaa &ab, aaa &ac)
{
if (ab.x == ac.x && ab.y == ac.y)
return true;
else
return false;
}
int main()
{
aaa a1, a2, a3;
a1.x = 1;
a1.y = 1;
a2.x = 2;
a2.y = 2;
a3.x = 3;
a3.y = 3;
vector<aaa> vec1;
vector<aaa> vec2;
vector<aaa> vec;
vec1.push_back(a1);
vec1.push_back(a2);
vec2.push_back(a3);
vec2.push_back(a1);
vec2.push_back(a2);
map<int, vector<aaa>> map1;
map1[0] = vec1;
map1[1] = vec2;
map<int, vector<aaa>>::iterator iter = map1.begin();
vector<aaa> vec3 = iter->second;
iter++;
vector<aaa> vec4 = iter->second;
set_intersection(vec3.begin(), vec3.end(), vec4.begin(), vec4.end(), inserter(vec, vec.begin()),cmp);
cout << vec.size() << endl;
cout << vec[0].x <<" "<<vec[0].y<< endl;
cout << vec[1].x <<" "<<vec[1].y<< endl;
getchar();
return 0;
}