2

私はフォームのマップを持っていますmap<key1, map<key2, value> > :

例: 次のマップの 2D 座標 (x,y) に強度値を格納しています。

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

ここで、座標 (x,y) の強度値がこのマップに存在するかどうかを確認します。私が知っている1つの方法は、次を確認することです:

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 に答える