【问题标题】:C++ Missing elements when inserting a vector of pairs into an unordered_map将成对向量插入 unordered_map 时 C++ 缺少元素
【发布时间】:2020-11-15 23:09:53
【问题描述】:

我有以下别名

/**
 * @typedef PixelPos
 * @brief   Coordinates of pixel position
*/
using PixelPos = pair<int, int>; /// (row,column)
using ContextTableBase = unordered_map< PixelPos, vector<PixelPos> >; /// (hash(px), list of neighbours)

为了方便,不直接使用unordered_map,而是为了保留实现hash函数所需的信息,定义了一个新的子类。

class ContextTable : public ContextTableBase
{
///... definition of operators and constructor ...
               return ContextTableBase::operator[]( PixelPos{ oPixel.first * (height - (height-width)), oPixel.second } );
} 

而采用的散列函数是

template<> struct hash<PixelPos>
    {
        std::size_t operator()(PixelPos const& pixel) const noexcept
        {
            return pixel.first + pixel.second; /// mapped row + col
        }
    };

在一个名为 getLocalContext 的函数中,对于由 PixelPos 表示的正方形图像的每个像素(由行和列 - 均为整数 - 排列),我使用函数查找一些邻居 applyMask,如下图所示。

/**
 * @brief Función local para aplicar la mascara del contexto local a cada uno de los pixeles
 * @param oPosition [in] - px location
 * @param oMask [in] - context mask
 * @param width [in] - number of columns of the image
 * @param height [in] - number of rows of the image
 * @param oRet [out] - Return list
 * @returns oRet
*/
static void applyMask(const PixelPos& oPosition, const ContextMask& oMask, const int width, const int height, vector<PixelPos>& oRet)
{
    for(const auto& dot : oMask )
    {
        PixelPos oCandidate{ oPosition.first + dot.first, oPosition.second + dot.second };
/// ... do something to check if candidate is neighbour...
            oRet.push_back(oCandidate);
/// ... do something else ...
    }
}

/// ... more code ...

/**
 * @brief Context calculator
 * @param N [in] - Context size
 * @param width [in] - number of columns of the image
 * @param height [in] - number of row of the image
 * @returns oTable, hash table which entries are pxs and returns a list of neighbours
*/
ContextTable& getLocalContext(const size_t N, const int width, const int height)
{

    ContextTable oTable = new ContextTable(height, width);
    ContextMask oMask{ createPixelMask(N) };

    for(int row = 0; row < height; ++row)
    {
        for(int col = 0; col < width; ++col)
        {

            PixelPos oPosition{ row, col };
            if( oTable.find(oPosition) == oTable.end() )
            {
                vector<PixelPos> oNeighbours{};
                applyMask(oPosition, oMask, width, height, oNeighbours);
                oTable.insert(make_pair(oPosition, oNeighbours));
            }
                

        }
    }
  return (*oTable);
}

此函数返回的向量是正确的,并且具有我正在寻找的像素,但是在将其添加到 oTable 之后,在离开 getLocalContext 之前,第一行下方像素的条目丢失了.

例如,问题的输出显示为大小为 5x4(行、列)的图像

要插入到 oTable 中的正确值(每次调用 applyMask 后取自 oNeighbours)是

applyMask px central: r: 0| c: 0
applyMask px central: r: 0| c: 1
applyMask    n: r: 0| c: 0
applyMask px central: r: 0| c: 2
applyMask    n: r: 0| c: 1
applyMask    n: r: 0| c: 0
applyMask px central: r: 0| c: 3
applyMask    n: r: 0| c: 2
applyMask    n: r: 0| c: 1
applyMask px central: r: 1| c: 0
applyMask    n: r: 0| c: 0
applyMask    n: r: 0| c: 1
applyMask px central: r: 1| c: 1
applyMask    n: r: 1| c: 0
applyMask    n: r: 0| c: 1
applyMask    n: r: 0| c: 0
applyMask    n: r: 0| c: 2
applyMask px central: r: 1| c: 2
applyMask    n: r: 1| c: 1
applyMask    n: r: 0| c: 2
applyMask    n: r: 0| c: 1
applyMask    n: r: 0| c: 3
applyMask    n: r: 1| c: 0
applyMask px central: r: 1| c: 3
applyMask    n: r: 1| c: 2
applyMask    n: r: 0| c: 3
applyMask    n: r: 0| c: 2
applyMask    n: r: 1| c: 1
applyMask px central: r: 2| c: 0
applyMask    n: r: 1| c: 0
applyMask    n: r: 1| c: 1
applyMask px central: r: 2| c: 1
applyMask    n: r: 2| c: 0
applyMask    n: r: 1| c: 1
applyMask    n: r: 1| c: 0
applyMask    n: r: 1| c: 2
applyMask px central: r: 2| c: 2
applyMask    n: r: 2| c: 1
applyMask    n: r: 1| c: 2
applyMask    n: r: 1| c: 1
applyMask    n: r: 1| c: 3
applyMask    n: r: 2| c: 0
applyMask px central: r: 2| c: 3
applyMask    n: r: 2| c: 2
applyMask    n: r: 1| c: 3
applyMask    n: r: 1| c: 2
applyMask    n: r: 2| c: 1
applyMask px central: r: 3| c: 0
applyMask    n: r: 2| c: 0
applyMask    n: r: 2| c: 1
applyMask px central: r: 3| c: 1
applyMask    n: r: 3| c: 0
applyMask    n: r: 2| c: 1
applyMask    n: r: 2| c: 0
applyMask    n: r: 2| c: 2
applyMask px central: r: 3| c: 2
applyMask    n: r: 3| c: 1
applyMask    n: r: 2| c: 2
applyMask    n: r: 2| c: 1
applyMask    n: r: 2| c: 3
applyMask    n: r: 3| c: 0
applyMask px central: r: 3| c: 3
applyMask    n: r: 3| c: 2
applyMask    n: r: 2| c: 3
applyMask    n: r: 2| c: 2
applyMask    n: r: 3| c: 1
applyMask px central: r: 4| c: 0
applyMask    n: r: 3| c: 0
applyMask    n: r: 3| c: 1
applyMask px central: r: 4| c: 1
applyMask    n: r: 4| c: 0
applyMask    n: r: 3| c: 1
applyMask    n: r: 3| c: 0
applyMask    n: r: 3| c: 2
applyMask px central: r: 4| c: 2
applyMask    n: r: 4| c: 1
applyMask    n: r: 3| c: 2
applyMask    n: r: 3| c: 1
applyMask    n: r: 3| c: 3
applyMask    n: r: 4| c: 0
applyMask px central: r: 4| c: 3
applyMask    n: r: 4| c: 2
applyMask    n: r: 3| c: 3
applyMask    n: r: 3| c: 2
applyMask    n: r: 4| c: 1

但是,实际存储的值(从 oTable 获取,然后从 getLocalContext 返回)是

 px central: r: 0| c: 0
 px central: r: 0| c: 1
     n: r: 0| c: 0
 px central: r: 0| c: 2
     n: r: 0| c: 1
     n: r: 0| c: 0
 px central: r: 0| c: 3
     n: r: 0| c: 2
     n: r: 0| c: 1
 px central: r: 1| c: 0
     n: r: 3| c: 0
     n: r: 3| c: 1
 px central: r: 1| c: 1
     n: r: 4| c: 0
     n: r: 3| c: 1
     n: r: 3| c: 0
     n: r: 3| c: 2
 px central: r: 1| c: 2
     n: r: 4| c: 1
     n: r: 3| c: 2
     n: r: 3| c: 1
     n: r: 3| c: 3
     n: r: 4| c: 0
 px central: r: 1| c: 3
     n: r: 4| c: 2
     n: r: 3| c: 3
     n: r: 3| c: 2
     n: r: 4| c: 1
 px central: r: 2| c: 0
 px central: r: 2| c: 1
 px central: r: 2| c: 2
 px central: r: 2| c: 3
 px central: r: 3| c: 0
 px central: r: 3| c: 1
 px central: r: 3| c: 2
 px central: r: 3| c: 3
 px central: r: 4| c: 0
 px central: r: 4| c: 1
 px central: r: 4| c: 2
 px central: r: 4| c: 3

【问题讨论】:

  • (height - (height-width)) 等于 width。你是这个意思吗?看起来很奇怪。

标签: c++ algorithm data-structures memory-management stl


【解决方案1】:

解决了发现unordered_map的find和insert方法没有被覆盖,导致调用了错误版本的hash函数后的问题。

getLocalContext 上应用的更改是

       PixelPos oMappedPosition{ row * (height - (height-width)), col };
       if( oTable.find(oMappedPosition) == oTable.end() )
       {
         vector<PixelPos> oNeighbours{};
         applyMask(PixelPos{row, col}, oMask, width, height, oNeighbours);
         oTable.insert(make_pair(oMappedPosition, oNeighbours));
       }

【讨论】:

  • 标记为已回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多