C++中STL学习笔记——各类容器混合使用


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

猜你喜欢

转载自blog.51cto.com/15069472/2577329