2

我有一张表格的地图map<key1, map<key2, value> >

例如:我将强度值存储在以下地图中的二维坐标(x,y)处:

map<int, map<int, double> > intensityValue;

现在,我想检查此地图中是否存在坐标 (x,y) 处的强度值。我知道的一种方法是检查:

if(intensityvalue[x][y] >=0)

在这种情况下,如果intensityValue[x][y]地图中不存在,那么在检查后它将自动插入我不想要intensityValue[x][y]的地图中。

请提出一种有效的方法,以便我可以intensityValue[x][y]在不将其插入地图的情况下检查地图中是否已存在。

4

5 回答 5

6

您可以std::map::find与短路评估一起使用:

bool foundXY = instensityValue.find(x) != intensityValue.end() &&
               intensityValue[x].find(y) != intensityValue[x].end();

std::map::count

bool foundXY = instensityValue.count(x) && intensityValue[x].count(y)
于 2013-10-30T17:01:18.173 回答
1

您可以std::map::find在访问之前使用并检查元素是否存在。您可以在此处阅读使用/文档:http: //en.cppreference.com/w/cpp/container/map/find

于 2013-10-30T17:00:55.640 回答
1

为它编写一个简短的函数,以确保调用最小数量的地图查找。

bool hasIntensity(int x, int y)
{
    map<int, map<int, double> >::const_iterator i = intensityValue.find(x);
    if (i == intensityValue.end()) return false;
    map<int, double>::const_iterator j = i->second.find(y);
    return j != (i->second.end());
}

如果要在找到元素时获取实际值,只需使用j->second.

于 2013-10-30T17:02:39.953 回答
1

利用std::map::find

auto outerIt = intensityValue.find(x);
if (outerIt != intensityValue.end()) {
    auto innerIt = outerIt->find(y);
    if (innerIt != outerIt->end()) {
        // Do something with the found value
        return;
    }
}
// Didn't return, so it wasn't found

也就是说,根据我的经验,对这种事情使用单个配对地图比嵌套地图更有效且更易于使用。它更适合标准算法,并且几乎不涉及树导航。

template <typename T, typename U, typename V>
using map2d = std::map<std::pair<T, U>, V>;

int main() {
    map2d<int, int, double> myMap {
        {{3, 4}, 808.14f},
        {{1, 2}, 333.33f}
    };
    auto it = myMap.find({3, 4});
    if (it != myMap.end()) {
        std::cout << it->second << std::endl;
    }
}
于 2013-10-30T17:17:42.880 回答
0

这有点难看,但也应该工作:(使用 C++11)

std::map<int, std::map<int, double> > intensityValue;
int x,y;
auto it = std::find_if(intensityValue.begin(),
                    intensityValue.end(),
                    [x,y](const std::pair<int, std::map<int, double>>& p){
                      return p.first==x && 
                             p.second.find(y) !=p.second.end();
                    }
                    );

  if(it != intensityValue.end())
  {
      //Got it !
  } 
于 2013-10-30T17:10:33.617 回答