STL
概要概要
最近、何かに取り組んでいるときに、もっと複雑なデータ保存方法を使用しました。実際、複雑さは主に自分のスキルによるものです。大物の人にとっては、一目でわかります。私の最終的な目標は、2つの座標セットの交差を実現することです。これを実現するために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:ポイントを使用して転送し、次に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 in
//创建一个中转变量
Point temp;
//初始化temp
temp.x = 1;
temp.y = 1;
temp.label = 1;
//传值
RegionObject[0].push_back(temp);
以前のコードはこのように書かれているので、後で他の方法を思いつきました。変更はありません。これらの複合コンテナを明確にするために、単一のコンテナについて明確にすることが前提です。
セットの交差点を見つける
最初はset_intersection関数を使用して直接解決することを考えましたが、最初は5つのパラメーターを持つ関数のバージョンが1つしか見つかりませんでした。
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;
}