2017-02-24 10 views
0

これはビルドされず、コンパイルエラーが理解できません。std :: unordered_mapをなぜstd :: partitionできないのですか?

#include <unordered_map> 
#include <algorithm> 

int main() 
{ 
    std::unordered_map<int, size_t> occurences = { { 10, 2 }, { 20, 5 }, { 30, 0 }, { 40, 5 }, { 50, 0 }, { 100, 9 } }; 

    auto newEnd = std::partition(occurences.begin(), occurences.end(), [](const std::pair<int, size_t> &p) 
     { 
     return p.second == 0; 
     }); 

    return 0; 
} 

g ++は以下のとおりです。 VS2013はさらに謎です。私の知る限り、このマップを伝えることができるよう

See it live on Coliru here

/usr/local/include/c++/6.3.0/bits/stl_pair.h: In instantiation of 'void std::pair<_T1, _T2>::swap(std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = long unsigned int]': /usr/local/include/c++/6.3.0/bits/stl_pair.h:473:7: required from 'void std::swap(std::pair<_T1, _T2>&, std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = long unsigned int]' /usr/local/include/c++/6.3.0/bits/stl_algobase.h:148:11: required from 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = std::__detail::_Node_iterator, false, false>; _ForwardIterator2 = std::__detail::_Node_iterator, false, false>]' /usr/local/include/c++/6.3.0/bits/stl_algo.h:1500:20: required from '_ForwardIterator std::__partition(_ForwardIterator, _ForwardIterator, _Predicate, std::forward_iterator_tag) [with _ForwardIterator = std::__detail::_Node_iterator, false, false>; _Predicate = main()::&)>]' /usr/local/include/c++/6.3.0/bits/stl_algo.h:4524:30: required from '_BIter std::partition(_BIter, _BIter, _Predicate) [with _BIter = std::__detail::_Node_iterator, false, false>; _Predicate = main()::&)>]' main.cpp:12:4: required from here /usr/local/include/c++/6.3.0/bits/stl_pair.h:416:6: error: no matching function for call to 'swap(const int&, const int&)' swap(first, __p.first);

ので、私は困惑 cppreference.comに記載されているのstd ::パーティションの種類の要件を満たしています。私の質問はなぜそれが構築されないのですか?

+2

これは何をしますか? 'std :: map'は常にソートされます。 'std :: unordered_map'は、順序の固定観念がありません。どちらの場合でも、パーティション分割は意味をなさない。 – jtbandes

+0

@jtbandesこれは、実際のコードが他の理由で適切なコンテナとしてマップされている最小限の例です。私のここでの使い方は、ゼロの出現を持つints(インデックス)が必要な小さな部分です。私はstd ::の回避策をベクトルに内容をコピーすることができます。 – acraig5075

+1

イテレータの[ValueSwappable](http://en.cppreference.com/w/cpp/concept/ValueSwappable)要件が不足しています。 – molbdnilo

答えて

5

const Keyを変更することはできませんので、あなたがそれらをstd::partitionのようなアルゴリズムを使用して、順序を再することはできませんのでmapunordered_mapの要素は、std::pair<const Key, value>ないstd::pair<Key, Value>あるため、エラーがある:

error: no matching function for call to 'swap(const int&, const int&)' 

マップ自体は要素を並べ替えることができ、不変量を維持するために必要な順序で要素を保持します。並べ替えると、マップの内部データ構造が破損します。

+0

質問に編集していただきありがとうございます、それはタイプミスでした。 – acraig5075

4

std::partitionが提供するコンテナ内の要素を並べ替え、しかし、あなたはstd::mapの要素の順序を変更することはできません - それは、その要素の定義済みの固定順序を持っています。標準では、マップの要素を反復処理するときに、常に増加する順序で繰り返すことが保証されています。

タイトルでunordered_mapと言いますが、mapと異なり、要素の順序は保証されませんが、要素の並べ替えもできません。結局のところ、unordered_mapの順不同でなので、その要素を反復する順序について決して保証されません。

関連する問題