int rausbekommen aus queue<pair<int , char* > >, wenn man ein char* hat



  • Hallo,

    alles steht eigentlich schon im Titel.
    Ich brauche so eine schleife, mit der ich aus der queue den int rausbekomme, der einem gewissen char* enstspricht.

    Danke im Voraus für die Vorschläge.

    CP



  • Hmm std::find nehmen 😛 Nen passende struct dafür schreiben, die dir das dann macht, und fertig 🙂

    struct compare_char
    {
        compare_char(std::string const& string) : compare_string(string) {}
        bool operator()(std::pair<int, char*> const& item) const
        { return std::strcmp(item.second, compare_string.c_str()) == 0; }
    private:
        const std::string compare_string;
    };
    
    std::find(my_deque.begin(), my_deque.end(), compare_char("mein String"));
    

    ... sollte eigtl. gehen ^^



  • ich bin glaube ich noch nicht so weit 😋



  • ich bin glaube ich noch nicht so weit

    Dann solltest du wahrscheinlich auch besser std::pair<int, std::string> als Element deiner Deque nehmen, da du bei char* ja selber für die Speicherverwaltung sorgen müßtest.



  • So scheint es zu funktionieren. Ich habe aber den Vector genommen.
    Passt es so für den Anfang? 🙂

    char* ippcc = "0.0.0.2:000000";
      	vector<pair<int , char* > > vector_int_charArr;
      	pair<int , char* > pair1(1, "0.0.0.1:000000"); 
      	pair<int , char* > pair2(2, "0.0.0.2:000000");
      	pair<int , char* > pair3(3, "0.0.0.3:000000");
      	vector_int_charArr.push_back(pair1);
      	vector_int_charArr.push_back(pair2);
      	vector_int_charArr.push_back(pair3);
    
      	for  (uint i = 0; i< vector_int_charArr.size(); i++){
    
      	cout<<"vector_int_charArr[i] = "<<vector_int_charArr[i].first<<"  ";
      	cout<<"vector_int_charArr[i] = "<<vector_int_charArr[i].second<<" ";
    
      	if (vector_int_charArr[i].second == ippcc){
      	cout<<"It's the right int   "<<vector_int_charArr[i].first<<"   ";
      		}
    
      	}
      	cout<<endl;
    


  • Ne, weil mit char*==char* kommt nix vernünftiges raus, da nur Zeiger verglichen werden. Bzw hier würde wahrscheinlich schon was vernünftiges rauskommen, aber es macht nicht wirklich das, was du willst. Kurz: Guck dir mal strcmp an 🙂



  • OK! hab's jetzt so gemacht und das geht

    if (strcmp(vector_int_charArr[i].second , ippcc) == 0){
      	cout<<"It's the right int   "<<vector_int_charArr[i].first<<"   ";
     	}
    


  • Perfécto 👍

    Was auch noch elegant wäre: Die Schleife statt mit einer Int-Variable mit einem Iterator durchzulaufen:

    // statt
    for  (uint i = 0; i< vector_int_charArr.size(); i++)
    
    // dann
    for ( vector< pair<int,char*> >::iterator elemIter=vector_int_charArr.begin(); elemIter!=vector_int_charArr.end(); elemIter++ )
    
    // und den Zugriff mit
    *elemIter
    
    // also
    cout<<"vector_int_charArr[i] = "<< elemIter->first <<"  ";
    cout<<"vector_int_charArr[i] = "<< elemIter->second <<" ";
    
    if ( strcmp(elemIter->second , ippcc) == 0 )
        cout<<"It's the right int   "<< elemIter->first <<"   ";
    

    🙂



  • Oder wie oben von mir schon geschrieben, einfach std::find-Algorithmus nutzen und nur einen passenden Funktor anlegen 😛



  • Wenn du std::string benutzen würdest, dann könntest du auch einfach "if(s1 == s2)" schreiben.
    Und eigentlich ist dein Code nicht Standard-C++ konform, da du wenigstens "const char *" benutzen müßtest (denn String-Literale sind konstant).


Anmelden zum Antworten