Notas de estudio de STL en C ++: uso mixto de varios contenedores


STL

Visión general

Recientemente, utilicé un método de almacenamiento de datos más complicado cuando estaba trabajando en algo. De hecho, la complejidad se debe principalmente a mis propias habilidades. Para los grandes, puedo verlo de un vistazo. Mi objetivo final es lograr la intersección de dos conjuntos de coordenadas. Como quiero usar STL para lograr esto, en la etapa inicial, usé un contenedor para almacenar todo tipo de datos.

Formato de almacenamiento de datos

Primero, se necesita una estructura para almacenar el conjunto de puntos. Donde xey son coordenadas y etiqueta es la etiqueta del punto.


typedef struct point
{
    int x;
    int y;
    int label;
    point()
    {
        x = -1;
        y = -1;
        label = -1;
    }
} Point;

Luego defina un RegionObject

map <int, vector <Point>> RegionObject;
Dado que no he usado una estructura de almacenamiento demasiado compleja antes, es difícil asignar valores a RegionObject (principalmente también). ¿Hay alguna referencia para la asignación de estructuras similares en Internet, entonces Solo busca a tientas y prueba. Finalmente, se encontraron varios métodos de asignación.

Método 1 : use Point para transferir, y luego 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;

Método 2 : use Point para transferir y luego push_back en


//创建一个中转变量
Point temp;
//初始化temp
temp.x = 1;
temp.y = 1;
temp.label = 1;
//传值
RegionObject[0].push_back(temp);

Más tarde, se me ocurrieron otras formas, porque el código anterior se ha escrito de esta manera, no hay cambios. Para aclarar estos contenedores compuestos, la premisa es tener claro acerca de un solo contenedor.

Encuentra la intersección de conjuntos

Al principio, pensé en usar la función set_intersection para resolver directamente, pero al principio solo encontré una versión de la función que tiene cinco parámetros.


set_intersection(vec3.begin(), vec3.end(), vec4.begin(), vec4.end(), inserter(vec, vec.begin()));

Se me ocurrió que la función no indicaba el método de intersección de un solo elemento de acuerdo con el método de intersección. La ausencia de un parámetro de determinación indica que se llamó al método de comparación predeterminado. Supongo que fue determinado por "==", por lo que se definió dentro de la estructura Una función sobrecargada del operador "==".


 bool operator==(point a1){
      if(this->x == a1.x && this->y == a1.y) return true;
      else return false;
  }

Luego use la función anterior para encontrar la intersección y descubra que hay un problema. El signo "<" aparece en el informe de error. Por lo tanto, el "==" creo que puede ser un poco problemático. Después de eso, no profundicé en su código fuente, pero descubrí que la función de intersección en realidad tiene una versión sobrecargada, que puede agregar una función de comparación personalizada, así que personalicé una función cmp para realizar la clase de coordenadas (también puedo decir Es la función del vector multidimensional) intersección.

Implementación

De hecho, su implementación específica es mucho más complicada que la siguiente, esto es lo que simplifiqué.


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

Supongo que te gusta

Origin blog.51cto.com/15069472/2577329
Recomendado
Clasificación