2017-02-24 2 views
0

Das erstellt nicht und ich verstehe den Kompilierungsfehler nicht.Warum kann ich nicht std :: diese std :: unordered_map partitionieren?

#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 ++ beschwert sich wie folgt. VS2013 ist noch kryptischer.

/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);

See it live on Coliru here

Soweit ich diese Karte sagen kann, erfüllt die Anforderungen std :: Partitionstyp aufgelistet auf cppreference.com so stumped ich bin. Meine Frage ist, warum baut es nicht?

+2

Was möchten Sie tun? Eine 'std :: map' wird immer sortiert. Eine 'std :: unordered_map' hat keinen festen Ordnungsbegriff. In jedem Fall macht die Partitionierung keinen Sinn. – jtbandes

+0

@jtbandes Der Grund, warum ich dies tun möchte, ist, dass dies ein minimales Beispiel ist, wo der tatsächliche Code eine Karte als den geeigneten Container aus anderen Gründen hat. Meine Verwendung hier ist ein kleiner Teil, wo ich die Ints (Indizes), die null Vorkommen haben wollen. Ich kann umgehen mit std :: den Inhalt in einen Vektor kopieren. – acraig5075

+1

Sie haben die Anforderung [ValueSwappable] (http://en.cppreference.com/w/cpp/concept/ValueSwappable) für die Iteratoren verpasst. – molbdnilo

Antwort

5

Der Fehler ist, weil die Elemente eines map und unordered_mapstd::pair<const Key, value> sind nichtstd::pair<Key, Value>, so dass Sie sie nicht erneut um einen Algorithmus wie std::partition verwenden, da die const Key nicht geändert werden können:

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

Nur die Karte selbst kann die Elemente neu anordnen und sie in der Reihenfolge belassen, die sie benötigt, um ihre Invarianten beizubehalten. Wenn Sie sie neu ordnen, beschädigen Sie die internen Datenstrukturen der Karte.

+0

Vielen Dank für die Bearbeitung der Frage, es war ein Tippfehler. – acraig5075

4

std::partition ordnet die Elemente in dem Behälter vorgesehen, jedoch können Sie nicht die Elemente eines std::map neu anordnen - es hat eine vordefinierte feste Reihenfolge seiner Elemente. Der Standard garantiert, dass Sie beim Iterieren der Elemente einer Map diese immer in aufsteigender Reihenfolge durchlaufen.

Wie Sie im Titel unordered_map erwähnen, werde ich auch erwähnen, dass im Gegensatz zu map es keine Garantien über die Reihenfolge seiner Elemente gibt, aber die Neuordnung seiner Elemente ist auch nicht möglich. Nach alle unordered_map ist ungeordnet so wird es nie eine Garantie über die Reihenfolge geben, in der Sie über seine Elemente iterieren.

Verwandte Themen