Map



  • rewe schrieb:

    Wie kann ich die Map nach einem bestimmten Wert durchsuchen?

    Wie wär's mal mit einer STL-Referenz?
    Z.B. http://www.dinkumware.com/manuals/reader.aspx?lib=cpp

    In diesem Fall sind:
    map::find,
    map::lower_bound,
    map::upper_bound,
    map::equal_range

    interessant.



  • HumeSikkins schrieb:

    rewe schrieb:

    Wie kann ich die Map nach einem bestimmten Wert durchsuchen?

    Wie wär's mal mit einer STL-Referenz?
    Z.B. http://www.dinkumware.com/manuals/reader.aspx?lib=cpp

    In diesem Fall sind:
    map::find,
    map::lower_bound,
    map::upper_bound,
    map::equal_range

    interessant.

    Erstmals danke für den link.

    Ich hab es probiert:
    (ist das richtig so nach einem Value zu suchen??)

    std::pair<map<const long, double>::iterator, map<const long, double>::iterator>> Pair;
    	map<const long, double> MyMap;
    	MyMap[1] = 1.5;
    	MyMap[2] = 2.5;
    	std::equal_range<const long, double>(MyMap.begin(),MyMap.end(),2.5);
    

    Compiler sagt:
    Compiling...
    temp2.cpp
    D:\Projects\temp2\temp2.cpp(55) : error C2664: 'struct _STL::pair<long,long> __cdecl _STL::equal_range(long,long,const double &)' : cannot convert

    parameter 1 from 'struct _STL::_Rb_tree_iterator<struct _STL::pair<long const ,double>,struct _STL::_N
    onconst_traits<struct _STL::pair<long const ,double> > >' to 'long'
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    Error executing cl.exe.
    
    temp2.exe - 1 error(s), 0 warning(s)
    


  • du sollst nicht std::equal_range sondern map::equal_range verwenden



  • SirLant schrieb:

    du sollst nicht std::equal_range sondern map::equal_range verwenden

    Habs nicht absichtlich falsch gemacht 😉



  • SirLant schrieb:

    du sollst nicht std::equal_range sondern map::equal_range verwenden

    Allerdings suchen die Memberfunktionen nach einem Schlüssel. Denn nur das ist bei einer Map effizient möglich (dazu ist sie ja da). Ein Wert lässt sich nur in O(n) finden. Z.B. über std::find.

    struct CompareTo2nd
    {
    public:
    	typedef map<long, double>::value_type value_type;
    	CompareTo2nd(double val)
    		: val_(val)
    	{}
    	bool operator()(const value_type& v) const
    	{
    		return v.second == val_;
    	}
    private:
    	double val_;
    };
    
    int main(int argc, char* argv[])
    {	
    	map<long, double> m;
    	m[0] = 1.0;
    	m[1] = 2.0;
    	map<long, double>::iterator it = find_if(m.begin(), m.end(), CompareTo2nd(2.0));
    	if (it != m.end())
    	{
    		cout << "gefunden: {" << it->first << ", " << it->second << "}" << endl;
    	}
    }
    


  • HumeSikkins schrieb:

    SirLant schrieb:

    du sollst nicht std::equal_range sondern map::equal_range verwenden

    Allerdings suchen die Memberfunktionen nach einem Schlüssel. Denn nur das ist bei einer Map effizient möglich (dazu ist sie ja da). Ein Wert lässt sich nur in O(n) finden. Z.B. über std::find.

    struct CompareTo2nd
    {
    public:
    	typedef map<long, double>::value_type value_type;
    	CompareTo2nd(double val)
    		: val_(val)
    	{}
    	bool operator()(const value_type& v) const
    	{
    		return v.second == val_;
    	}
    private:
    	double val_;
    };
    
    int main(int argc, char* argv[])
    {	
    	map<long, double> m;
    	m[0] = 1.0;
    	m[1] = 2.0;
    	map<long, double>::iterator it = find_if(m.begin(), m.end(), CompareTo2nd(2.0));
    	if (it != m.end())
    	{
    		cout << "gefunden: {" << it->first << ", " << it->second << "}" << endl;
    	}
    }
    

    Genau sowas habe ich gesucht! 😃
    Habe ich mich denn so unverständlich ausgedrückt??!! 😉



  • Noch was STL-spezifisches:

    itr = container.begin()+5; //itr zeigt auf das fünfte Element von container, soweit so gut. 
    //Geht das auch mit einer anderen C++ Anweisung die noch ein wenig einfacher ist? Sowas in der Art wie GetItr(5) und man hat direkt seinen iterator der auf das fünfte Element zeigt?! 
    //Gibt's da was?
    


  • rewe schrieb:

    Noch was STL-spezifisches:

    itr = container.begin()+5; //itr zeigt auf das fünfte Element von container, soweit so gut. 
    //Geht das auch mit einer anderen C++ Anweisung die noch ein wenig einfacher ist? Sowas in der Art wie GetItr(5) und man hat direkt seinen iterator der auf das fünfte Element zeigt?! 
    //Gibt's da was?
    

    Gibt es noch andere Möglichkeiten einen Iterator der auf Element n zeigt zu bekommen als erwähnte?



  • rewe schrieb:

    rewe schrieb:

    Noch was STL-spezifisches:

    itr = container.begin()+5; //itr zeigt auf das fünfte Element von container, soweit so gut. 
    //Geht das auch mit einer anderen C++ Anweisung die noch ein wenig einfacher ist? Sowas in der Art wie GetItr(5) und man hat direkt seinen iterator der auf das fünfte Element zeigt?! 
    //Gibt's da was?
    

    Gibt es noch andere Möglichkeiten einen Iterator der auf Element n zeigt zu bekommen als erwähnte?

    STL wieder:
    std::map hat folgende Operation:
    size_type count(const Key& key) const;
    Ich suche Code wo diese Op nicht 0 oder 1 zurück gibt? Bitte hier posten!



  • rewe schrieb:

    Ich suche Code wo diese Op nicht 0 oder 1 zurück gibt? Bitte hier posten!

    So langsam habe ich das Gefühl du hast überhaupt noch nicht verstanden, was eine Map ist und wozu man sie einsetzt bzw. du weigerst dich konsequent einen Blick in deine STL-Referenz zu werfen.
    Erst willst du unbedingt nach einem Wert suchen (statt nach Schlüsseln). Jetzt das.

    count zählt die Anzahl der Vorkommen eines Schlüssels.
    Map ist ein sortierter assoziativer Container mit der Eigenschaft, dass jeder Schlüssel eindeutig ist. Wie soll es denn da Code geben, bei dem count einen Wert größer 1 liefert? Wo wäre da die Eindeutigkeit?

    Wenn du count > 1 haben willst, musst du zu einer multimap greifen.



  • HumeSikkins schrieb:

    rewe schrieb:

    Ich suche Code wo diese Op nicht 0 oder 1 zurück gibt? Bitte hier posten!

    So langsam habe ich das Gefühl du hast überhaupt noch nicht verstanden, was eine Map ist und wozu man sie einsetzt bzw. du weigerst dich konsequent einen Blick in deine STL-Referenz zu werfen.
    Erst willst du unbedingt nach einem Wert suchen (statt nach Schlüsseln). Jetzt das.

    count zählt die Anzahl der Vorkommen eines Schlüssels.
    Map ist ein sortierter assoziativer Container mit der Eigenschaft, dass jeder Schlüssel eindeutig ist. Wie soll es denn da Code geben, bei dem count einen Wert größer 1 liefert? Wo wäre da die Eindeutigkeit?

    Wenn du count > 1 haben willst, musst du zu einer multimap greifen.

    Das ich mich nicht mit der STL Referenz befasse, stimmt nicht.
    count kann nicht > 1 sein, das wollte ich wissen und nun frage ich dich wo diese Op Sinn macht? --> nirgends
    Mit map::count kann ich also genau herausfinden ob ein Key der Map existiert oder nicht. Aber um das herauszufinden kann ich auch x andere Ops nehmen, die das auch können.



  • rewe schrieb:

    und nun frage ich dich wo diese Op Sinn macht? --> nirgends

    Wenn du mich fragen würdest, würde die Antwort anders lauten. Aber unabhängig von deiner Behauptung fragst du mich ja gar nicht.



  • Ich habe folgende STL Anweisung (funktioniert):
    std::find_if(Vec.begin(),Vec.begin()+nStart,Pred); //nStart ist ein Integer

    Ich möchte nun den Container auch noch rückwärts durchlaufen (hab probiert klappt jedoch nicht):
    std::find_if(Vec.begin()+nStart,Vec.begin(),Pred);

    😕


Anmelden zum Antworten