[英]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.Bimap或Boost.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::bimap
或boost::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.