Überprüfen ob Element in Array schon vorhanden ist



  • Hallo,

    ich bin ziemlich neu in C++ und wollte jetzt wissen wie ich überprüfen kann ob ein bestimmtes Element schon im Array gespeichert ist.

    Danke schon mal!




  • Mod

    314159265358979 schrieb:

    Sieh dir mal das an: http://www.cplusplus.com/reference/algorithm/binary_search/ 🙂

    For the function to yield the expected result, the elements in the range shall already be ordered according to the same criterion (operator< or comp).

    Was eher gesucht ist, ist
    http://www.cplusplus.com/reference/algorithm/find/



  • Oh, richtig, sorry.



  • Vielleicht ist auch noch http://www.cplusplus.com/reference/stl/set/ gesucht.



  • Wenn es ein normales Array ist kann ers ja auch einfach mit einer Schleife durchlaufen und jedes Element mit dem gesuchten vergleichen und dann gegebenfalls true oder false zurückgeben.
    Aber klar, die Algorithmen sind leichter, wollte diese Möglichkeit trotzdem nennen.

    Lg freeG



  • fr33g schrieb:

    Wenn es ein normales Array ist kann ers ja auch einfach mit einer Schleife durchlaufen und jedes Element mit dem gesuchten vergleichen und dann gegebenfalls true oder false zurückgeben.

    Das kann man nicht nur mit normalen Arrays, sondern mit allen Containern tun. Nur bringt das nichts, wenn es die gleiche Funktionalität schon fertig gibt.



  • Ja klar kann man es mit allen Container tun, aber dazu muss er im Normalfall auch die Funktionen der einzelnen Container kennen, was man aber normalerweise auch kann wenn man sie benutzt. Wenns eben ein Array ist braucht man nicht viel, gut man sollte halt nicht vergessen nicht über die Grenzen des Arrays zu gehen.

    Ich dachte nur wenn er vll noch ziehmlich am Anfang ist, ist es finde ich auch nicht schlecht sowas selber machen, auch wenns nix weltbewegendes ist 😉

    Lg freeG


  • Mod

    fr33g schrieb:

    Ja klar kann man es mit allen Container tun, aber dazu muss er im Normalfall auch die Funktionen der einzelnen Container kennen, was man aber normalerweise auch kann wenn man sie benutzt.

    Das muss man eben nicht wissen, weil die Container alle gleich sind was das durchiterieren angeht. Das ist ja gerade der Sinn des abstrakten Containerkonzepts.



  • SeppJ schrieb:

    fr33g schrieb:

    Ja klar kann man es mit allen Container tun, aber dazu muss er im Normalfall auch die Funktionen der einzelnen Container kennen, was man aber normalerweise auch kann wenn man sie benutzt.

    Das muss man eben nicht wissen, weil die Container alle gleich sind was das durchiterieren angeht. Das ist ja gerade der Sinn des abstrakten Containerkonzepts.

    Neeeein:D, das war mir so klar dass genau das kommt, hab mir das auch beim posten gedacht, aber es gibt doch trotzdem nochmal ein paar Unterschiede bei den Container wo man dann eben drauf achten muss, auch von den Funktionen her, weil alle gleich sind sie ja nicht. Aber stimmt schon im Großen und Ganzen gibts von der Bedienung nicht so viel Unterschiede da es ja abstrakt ist und dafür gedacht ist.

    Lg freeG



  • fr33g schrieb:

    aber es gibt doch trotzdem nochmal ein paar Unterschiede bei den Container wo man dann eben drauf achten muss, auch von den Funktionen her, weil alle gleich sind sie ja nicht.

    Wir haben hier nur vom Durchiterieren gesprochen. Das funktioniert bei allen STL-Containern genau gleich, nämlich mit Iteratoren von begin() bis end() . Natürlich gibt es sonstige Unterschiede, die man kennen sollte.

    Einer von vielen Gründen warum C-Arrays unpraktisch sind, ist ja gerade, dass sie kein STL-Interface anbieten. Bei generischem Code hat man dadurch unnötige Fallunterscheidungen. Mit std::tr1::array hat man sich diesem und vielen anderen Problemen angenommen.



  • Nexus schrieb:

    Einer von vielen Gründen warum C-Arrays unpraktisch sind, ist dass sie kein STL-Interface anbieten. Mit std::tr1::array hat man sich diesem und den vielen anderen Problemen angenommen.

    Naja, eigentlich kann man C-Arrays in jeden STL-Algorithmus packen. Dafür gibt es entsprechende Iterator-Traits, wodurch man die Fallunterscheidung den Compiler machen lassen kann.

    PS: Aber im Kern hast Du natürlich recht.



  • Tachyon schrieb:

    Naja, eigentlich kann man C-Arrays in jeden STL-Algorithmus packen. Dafür gibt es entsprechende Iterator-Traits, wodurch man die Fallunterscheidung den Compiler machen lassen kann.

    Ja, die Low-Level-Algorithmen, die auf Iteratoren basieren, funktionieren bei Arrays gleich gut. Aber Funktionen, die auf ganzen Containern arbeiten, benötigen Fallunterscheidungen. Beispiel:

    template <class Container>
    void OutputElements(const Container& c);
    

    Man kann natürlich schon versuchen, die Unterschiede wegzukapseln, aber manchmal kommt man eben doch nicht um die Unterscheidung herum. size() wäre ein weiteres Beispiel. Und das ist ja nur einer der Gründe, warum std::tr1::array rohen Arrays in nahezu allen Situationen überlegen ist.



  • Nexus schrieb:

    Tachyon schrieb:

    Naja, eigentlich kann man C-Arrays in jeden STL-Algorithmus packen. Dafür gibt es entsprechende Iterator-Traits, wodurch man die Fallunterscheidung den Compiler machen lassen kann.

    Ja, die Low-Level-Algorithmen, die auf Iteratoren basieren, funktionieren bei Arrays gleich gut. Aber Funktionen, die auf ganzen Containern arbeiten, benötigen Fallunterscheidungen. Beispiel:

    template <class Container>
    void OutputElements(const Container& c);
    

    Man kann natürlich schon versuchen, die Unterschiede wegzukapseln, aber manchmal kommt man eben doch nicht um die Unterscheidung herum. size() wäre ein weiteres Beispiel. Und das ist ja nur einer der Gründe, warum std::tr1::array rohen Arrays in nahezu allen Situationen überlegen ist.

    Ja, ist ist richtig.
    Eine gute Alternative zum direkten Arbeiten auf Containern ist das Arbeiten mit Ranges (im Sinne von boost::range). Dadurch kann man spezielle Anpassungen vermeiden.
    Aber ja: Es gibt in C++ nur sehr wenige Gründe, mit C-Arrays zu arbeiten.


Anmelden zum Antworten