Frage

Ich versuche, durch ein paar Reifen zu springen Daten in besonderer Weise zu organisieren. Ich bin ein vereinfachtes Stück Code enthalten, die meinen Schmerz zeigt.

Ich kann nicht boost. Ich bin die neueste Version von g ++ in Cygwin verwendet wird.

#include <iostream>
#include <map>

using namespace std;

int main () {

    map< int,int > genmap;
    map< int,int >::iterator genmapit;
    map< map<int,int>::iterator,int > itermap;

    // insert something into genmap
    genmap.insert (make_pair(1,500) );

    // find and return iterator.
    genmapit=genmap.find(1);

    // insert the iterator/int into itermap. Dies on each of the following 3 versions of this line.
    //itermap[genmapit] = 600; // crash
    //itermap.insert ( pair< map<int,int>::iterator,int >(genmapit,600) ); // crash
    itermap.insert ( make_pair(genmapit,600) ); // crash

    return 0;
}

So wie Sie sehen können, habe ich 1 einfache Karte, einen Iterator auf dieser Karte und einer anderen Karte, die das erste Argument als Iterator auf die erste Karte hat.

Es ist klar, aus dieser: Warum kann ich einen Iterator in Karte setzen? Das kann ich einen Iterator als zweites Argument hat. Jedoch stellt die Art und Weise oben gezeigt, dass dies:

$ make
g++    -c -o main.o main.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In member fun
ction `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp =
 std::_Rb_tree_iterator<std::pair<const int, int> >]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_tree.h:871:   instantiate
d from `std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _All
oc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::i
nsert_unique(const _Val&) [with _Key = std::_Rb_tree_iterator<std::pair<const in
t, int> >, _Val = std::pair<const std::_Rb_tree_iterator<std::pair<const int, in
t> >, int>, _KeyOfValue = std::_Select1st<std::pair<const std::_Rb_tree_iterator
<std::pair<const int, int> >, int> >, _Compare = std::less<std::_Rb_tree_iterato
r<std::pair<const int, int> > >, _Alloc = std::allocator<std::pair<const std::_R
b_tree_iterator<std::pair<const int, int> >, int> >]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_map.h:360:   instantiated
 from `std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_
Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, bool> std::
map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [wit
h _Key = std::_Rb_tree_iterator<std::pair<const int, int> >, _Tp = int, _Compare
 = std::less<std::_Rb_tree_iterator<std::pair<const int, int> > >, _Alloc = std:
:allocator<std::pair<const std::_Rb_tree_iterator<std::pair<const int, int> >, i
nt> >]'
main.cpp:23:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no
 match for 'operator<' in '__x < __y'
make: *** [main.o] Error 1

„von hier instanziiert“ sagt mir nichts und eine Web-Suche gibt mir keine Informationen zu diesem Thema.

Ist STL: Karte einfach nicht für das zulassen? Ich kann meine App zu arbeiten, um dieses neu codieren, aber es wird sehr ineffizient, und ich möchte diese Funktion erhalten. Gibt es eine andere Art von Zeiger ich für ein Kartenelement machen kann ich verwenden könnte?

Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Sie können dies nicht tun, weil std::map Iteratoren nicht zufällig Iteratoren Zugang ist so nicht vergleichbar mit <.

Stattdessen könnte man Hinweise auf die value_type in der ersten Karte als Kartenschlüssel verwenden.

Andere Tipps

Sie müssen lernen, die Fehlermeldungen zu lesen. Insbesondere Blick auf die Nachricht, die nach der langatmige Beschreibung kommt mit der Fehler passiert ist:

  

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'

Karte Iteratoren sind nicht vergleichbar mit weniger als Operator, der die Karte standardmäßig verwendet.

Ich nehme an, Sie eine Vergleichsfunktion zur Verfügung stellen können, die die Paare auf dem durch den Iterator vergleicht, da die Iteratoren sich nicht leicht in einer sinnvollen Art und Weise verglichen werden.

struct CompareIterator
{
     template <class FirstIter, class SecondIter>
     bool operator()(FirstIter lhv, SecondIter rhv) const
     {
         return *lhv < *rhv;
     }
};

//usage with map:
map< map<int,int>::iterator,int, CompareIterator > itermap;

std::pair definiert operator<. Ich habe auch zwei Iteratortypen, da es möglich sein könnte, die Typen unterschiedlich sind (iterator und const_iterator)

map<Key, Value>

Die map iterator als Schlüsselelement in einer anderen map nicht möglich ist, weil map operator < erwartet standardmäßig auf den Schlüssel definiert werden. Wenn die Key (in diesem Fall map iterator) nicht definiert ist, dann müssen Sie einen Funktor als Prädikat Funktion zu übergeben, die den Vergleich von Schlüsseln (Karte Iterator) bereitstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top