C ++でのSTL研究ノート-さまざまなコンテナの混合使用


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

おすすめ

転載: blog.51cto.com/15069472/2577329