2012-10-10 90 views

回答

3

使用std::unique然後驗證地圖的開始迭代和結束迭代器std::unique返回之間的距離是1

+0

這不是一個有效的解決方案,因爲'std :: unique'修改了地圖。 – Andrey

+0

@Andrey:不過,OP要求採用'最簡單'的方式(在'一次操作'中可行);我認爲一個'std :: unique'解決方案會很短,但實際上可能不是(我開始懷疑'std :: unique'可以用於'std :: map'迭代器,因爲迭代器指向一個與「const」第一個字段配對)。 –

0

此功能可滿足您的需求

template <typename Map> 
bool IsUnique(const Map& i_map) 
    { 
    return std::count_if(i_map.cbegin(), i_map.cend(), 
     [&i_map] (typename Map::const_reference v) 
     { 
     return v.second == i_map.cbegin()->second; 
     }) == i_map.size(); 
    } 
+3

這不是一個有效的解決方案,因爲'count_if'不會提前終止(只要發現第一個不匹配,該函數就會返回)。 ;-) –

2

獲取的價值第一個元素,然後使用std::all_of自定義謂詞檢查剩餘的元素。喜歡的東西:

if (!mp.empty()) { 
    int val = mp.begin()->second; 
    result = std::all_of(std::next(mp.begin()), mp.end(), 
         [val](typename <insert map type>::const_reference t){ return t->second == val; }); 
} 
+0

std :: all_of是C++ 11的順便說一句 – BlueTrin

0

你甚至可以做到這一點沒有if語句檢查性病的空地圖:: all_of如果你可以用一個多餘的比較活:

template<typename Key, typename Value> 
bool all_equal(std::map<Key, Value> const& map) 
{ 
    // the lambda will only get called when the map is not empty 
    // so we can safely access begin()->second 
    auto const cmpWithFirst = [&](std::pair<Key,Value> const& i) 
    { 
     return map.begin()->second == i->second; 
    }; 

    return std::all_of(map.begin(), map.end(), cmpWithFirst); 
} 

與此相比,所有元素第一個元素,如果有的話,包括第一個元素與第一個元素的比較。

相關問題