2014-09-16 9 views
5

Ich verwende die find() Methode von std::map, die einen Iterator zurückgibt.
Allerdings brauche ich den Index des gefundenen Elements; zum Beispiel: 0, was std::map::begin() entspricht, und so weiter.Drucken des Index eines Iterators in std :: map

#include <map> 
#include <utility> 
#include <iostream> 

int main() 
{ 
    std::map< int, int > aMap; 
    aMap.insert(std::make_pair(100, 50)); 
    aMap.insert(std::make_pair(200, 40)); 
    aMap.insert(std::make_pair(300, 60)); 

    std::map< int, int >::iterator it_map = aMap.find(300); 
    if (it_map != aMap.end()) 
    std::cout << it_map << "\n"; // error 

} 

Das kompiliert nicht und ich kenne den Grund. Ich brauche jedoch eine Möglichkeit zum Drucken 2, weil der Index von 300 ist 2.

Für dieses einfache Beispiel, können Sie sagen, dass Karte (Binärbaum) ist kein guter Container. Im echten Code gibt es jedoch Tonnen von Elementen, die ich durchsuchen muss, und binary tree ist dafür gut.

Irgendeine Idee?

+2

Wie Sie den Index einer binären Baumstruktur definieren ? – 101010

+0

@ 40zwei: Eine Map ist nicht notwendigerweise als Baum implementiert und hat keine baumartige Schnittstelle; aber es ist geordnet, so dass Sie einen Index entsprechend dieser Reihenfolge definieren können, wie die Frage beschreibt. –

+0

@MikeSeymour Standardmäßig ist es nicht unbedingt als Baum implementiert, zugestimmt. Allerdings ist jede Implementierung, die ich kenne, als Baum implementiert. Wenn ein Einfügen oder Extrahieren auftritt, ist darüber hinaus jede vorherige Reihenfolge gestört. Folglich können Sie, wie Ihre Antwort richtig sagt, einen Index definieren, aber nur für den aktuellen Zustand der 'std :: map'. – 101010

Antwort

7

Wenn Sie den Index benötigen, dann ist vielleicht eine Karte der falsche Datentyp; Sie müssen die Karte (in linearer Zeit) durchlaufen, um den Index zu finden, und verlieren so den Vorteil der logarithmischen Zeitsuche.

Vielleicht ist ein sortierter Vektor, der den Algorithmus lower_bound verwendet, um Elemente in logarithmischer Zeit zu finden, geeigneter. Dann können Sie den resultierenden Iterator mit wahlfreiem Zugriff vom Iterator begin() in konstanter Zeit subtrahieren.

Dennoch, wenn Sie eine Karte verwenden wollen:

std::cout << std::distance(aMap.begin(), it_map) << '\n'; 
5

Verwenden std::distance, wie folgt aus:

std::cout << std::distance(std::begin(aMap),it_map) << endl; 

Dokumentation here