簡體   English   中英

獲取具有相等值的map元素范圍

[英]get range of map elements with equal values

我有一張地圖聲明為:

std::map< std::pair<int, int>, bool > allPositions; // essentially, keys are just 2D points

我需要獲得其值為true元素范圍

使用std::equal_range

auto range = std::equal_range(allPositions.begin(), allPositions.end(), true);

給出了這些錯誤

錯誤C2672'operator __surrogate_func':找不到匹配的重載函數xutility

錯誤C2893無法專門化函數模板'unknown-type std :: less :: operator()(_ Ty1 &&,_ Ty2 &&)const'xutility

錯誤C2056非法表達xutility

錯誤C2672'operator __surrogate_func':找不到匹配的重載函數算法

錯誤C2893無法專門化函數模板'unknown-type std :: less :: operator()(_ Ty1 &&,_ Ty2 &&)const'算法

我認為我不需要謂詞函數,因為std::pair已經重載了operator <否則映射代碼將不會被編譯

那么如何使用std::equal_range for map來獲得具有相等值的對的范圍?

我需要獲得其值為 true元素范圍

你將不得不迭代地圖以獲得其值對為true迭代器...我有一個工作示例Live On Coliru 解除這樣的事情。

template<typename Map,
         typename Value    = typename Map::mapped_type,
         typename Compare  = std::equal_to<Value>,
         typename Iterator = typename Map::iterator>
std::vector<Iterator> equal_values(const Map& mp, const Value& val, Compare cmp = Compare()){
    std::vector<Iterator> rtn;
    for(auto iter = mp.begin(); iter != mp.end(); ++iter)
        if(cmp(iter->second, val))
            rtn.push_back(iter);
    return rtn;
}

或者,您可能希望使用Boost.BimapBoost.MultiIndex

那么如何使用std :: equal_range for map來獲得具有相等值的對的范圍?

假設您有一張包含以下數據的地圖:

{ {{0,0},false}, {{1,1},true}, {{2,2},false}, {{3,3},true} };

你期望相同的范圍返回true false

為了使其正常工作,必須根據用於獲取范圍的標准對容器進行分區。 std::map絕對不是get value by value的容器。 因此,您需要將數據或迭代器復制到不同的容器中並相應地對其進行排序,並使用該容器獲取范圍,或者通過過濾動態創建此類容器。 或者你可以使用像boost::bimapboost::multi_index這樣的容器來提供多個索引。

所以,假設您有一張地圖:

using point = std::pair<int,int>;
std::map<point,bool> my_map;

讓我們說你有一些價值觀:

my_map = { {{0,0},false}, {{0,1},true}, {{1,0},true}, {{1,1},false} };

現在讓我們看一下這個映射的第一個迭代器(取消引用時)將是:

{{0,0},false}

當你使用std::equal_range(my_map.begin(), my_map.end(), true); 你要求對被取消引用的迭代器進行true檢查。 但是,被引用的迭代器不是布爾值。 它是一對點和布爾值。
所以您可能想要嘗試的是以下內容:

using map_iter = std::map<point,bool>::iterator; //is {point,bool}
auto range = std::equal_range(my_map.begin(), my_map.end(), [](map_iter& iter){
  return iter.second == true;
};

編輯:
只是為了澄清,這將解決編譯器錯誤但不會解決映射值的邏輯錯誤(不一定)被排序,這樣你就可以得到一對迭代器,它們定義一個包含所有匹配值的范圍作為map不按值排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM