在使用自定义对象时,如何确保键映射到正确的值

时间:2017-02-14 07:19:02

标签: c++ dictionary stl stdmap

我正在使用具有以下结构的数据。

点对象是模板化数据类型,由浮点值组成,表示三维数据。

如果我想在某个点上访问数据

Point3D< float > p[0] = 1.1;
Point3D< float > p[1] = 2.3;
Point3D< float > p[2] = 2.3;

每个点还有一个与之关联的索引,以便于查找。 与点关联的索引是唯一的,反之亦然。

我有2个map_index_map,它接受一个Point对象并返回它的索引和一个index_site_map,它接收一个索引并返回相关的3d点。

他们的构建如下

std::map < Point3D< float > , int , PointCompare> site_index_map;
std::map < int, Point3D< float > > index_site_map;

其中“PointCompare”结构定义如下

struct PointCompare
{
   bool operator() (const Point3D< float >& lhs, const Point3D< float >& rhs) const
   {
       return lhs[0] <= rhs[0];
   }
};

我这样定义它是因为我理解当使用自定义对象作为键时我需要定义一个自定义比较器。

这是我的问题 当查询与index_site映射的前5个索引相关联的点,然后查询与返回的点相关联的索引时,我得到这个

Vertex 0: [-12.862379, -33.685909, -15.792738]
Index: 0
Vertex 1: [-12.709168, -33.382538, -15.792738]
Index: 0
Vertex 2: [-12.862379, -33.382538, -16.249332]
Index: 0
Vertex 3: [19.727800, 20.137928, -27.370831]
Index: 0
Vertex 4: [19.930809, 19.790909, -26.942013]
Index: 0

(Vertex后面的数字是循环计数器,通过给出索引站点地图的循环计数器得到相关的点)

我真的很困惑。当int到point map保持正确的顺序时,为什么将点映射到int的映射总是返回0作为点的索引?

先谢谢

编辑:提供其他详细信息

预期输出应为

Vertex 0: [-12.862379, -33.685909, -15.792738]
Index: 0
Vertex 1: [-12.709168, -33.382538, -15.792738]
Index: 1
Vertex 2: [-12.862379, -33.382538, -16.249332]
Index: 2
Vertex 3: [19.727800, 20.137928, -27.370831]
Index: 3
Vertex 4: [19.930809, 19.790909, -26.942013]
Index: 4

将PointCompare中的&lt; =更改为&lt;我得到了这个

Vertex 0: [-12.862379, -33.685909, -15.792738]
Index: 172275
Vertex 1: [-12.709168, -33.382538, -15.792738]
Index: 1
Vertex 2: [-12.862379, -33.382538, -16.249332]
Index: 172275
Vertex 3: [19.727800, 20.137928, -27.370831]
Index: 172437
Vertex 4: [19.930809, 19.790909, -26.942013]
Index: 4

有些指数变得正确。我正在使用此函数将值放在相应的映射中(请忽略与openmp相关的行)

void Put_In_Map(
                std::map < Point3D< float > , int , PointCompare> &site_index_map,
                std::map < int, Point3D< float > > &index_site_map,
                std::vector< PlyVertex< float > > &plyVertices,
                std::vector< TriangleIndex > &triangles
                ) {
    // Write lock to ensure data writes are single threaded
    omp_lock_t writelock;
    omp_init_lock(&writelock);

    // I know parallelization achieves nothing here, but just having it anyway
    #pragma omp parallel num_threads(NUM_THREADS)
    {
        int i = omp_get_thread_num();
        while ( i < plyVertices.size()) {
            omp_set_lock(&writelock);
            site_index_map[plyVertices[i]] = i;
            index_site_map[i] = plyVertices[i];
            omp_unset_lock(&writelock);
            i = i + NUM_THREADS;
        }
    }
}

打印我的输出

for (int i = 0; i < 5; i++) {
        Point3D< float > p = index_site_map[i];
        IdentifyVertex(p, i);
        std::cout << "Index: " << site_index_map[p] << std::endl;
    }

0 个答案:

没有答案