Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » elemente aus vektor auslesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2014, 08:43 Uhr
~toab
Gast


hallo!

ich habe zwei Vektoren von unterschiedlicher grösse erstellt und zufällig mit zahlen von 1-4 "befüllt". das ging alles problemlos.

nur jetzt würde ich gerne vergleichen, ob in diesen beiden Vektoren gleiche Zahlenkombinationen stehen. wie kann ich das denn machen?

vielen dank schon mal für eure hilfe!!

hier ist auch mal mein code:

#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

int main()
{
// initialize random seed:
srand(time(NULL));

vector<int> liste1; // Listen definieren
vector<int> liste2;

for (int i = 0; i < 1000; i++)
{
liste1.push_back(rand() % 4 + 1); // Liste befüllen
}

for (int i = 0; i < 10; i++)
{
liste2.push_back(rand() % 4 + 1); // Liste befüllen
}
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2014, 13:18 Uhr
~toab
Gast


ich hab mich mal ein wenig versucht, aber es funktioniert nicht so ganz wie ich es mir vorgestellt habe...

hier ist mal mein code:


C++:
// Vergleich der Listen
    int var1;
    int var2;

    for (int j = 0; j < liste1.size(); j++)
    {
        var1 = j;
        var2 = 0;

        while (liste1[var1] == liste2[var2])
        {
            cout << liste1[var1] << "  " << liste2[var2] << endl;
            if (var2 == liste2.size())
            {
                break;
            }
            else
            {
                var1++;
                var2++;
            }
        }
    }



wo liegt denn mein Denkfehler? kann mir da jemand weiterhelfen? wäre super...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.01.2014, 13:48 Uhr
TOSHMAX



Kannst du mir bitte kurz erklären, wie du zwei Listen mit unterschiedlichen Größen vergleichen willst (evtl. mit kurzem Beispiel)? Was für ein Ergebnis erwartest du?
Danach können wir deinen Ansatz weiterverfolgen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.01.2014, 15:36 Uhr
~toab
Gast


ich habe das von vorhin auch schon wieder verworfen... im Moment versuche ich die Listen komponentenweise zu vergleichen. ich nehme immer 10 Elemente aus dem ersten Vektor und vergleiche sie mit dem anderen Vektor. Dann gehe ich eine Stelle weiter...


C++:
vector<int> liste1neu;                        // neue Liste, die immer 10 Elemente der liste1 enthält
    int element;

    for (int seq = 0; seq < 500; seq++)
    {
        
        for (int i = seq; i < seq + 10; i++)
        {
            element = liste1.at(i);
            liste1neu.push_back(element);
            cout << liste1neu.at(i) << "\n" << endl;
        }

        if (liste1neu == liste2)
        {
            cout << "Treffer! Es wurde eine gleiche Sequenz in den beiden Vektoren gefunden. " << endl;
        }

    }



Aber leider funktioniert auch das noch nicht so richtig...

Hilft das etwas weiter?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.01.2014, 17:29 Uhr
TOSHMAX



Das Problem an dieser Lösung wird wohl sein, dass du liste1neu immer weiter befüllst. Wenn du aber immer nur die 10 Elemente darin haben willst, solltest du sie nach jedem Vergleich mittels liste1neu.clear() leeren oder die Definition in die erste Schleife packen (dann wird sie nach jedem Durchlauf neu angelegt).

Anstatt alle Elemente 10 mal zu kopieren und dann zu vergleichen wäre der Einsatz von std::equal sinnvoller. Das lässt sich z. B. so einsetzen:

C++:
std::equal(liste1.begin(), liste1.begin() + 10, liste2.begin())

Damit werden die ersten 10 Elemente von liste1 mit den ersten 10 von liste2 verglichen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.01.2014, 12:34 Uhr
~toab
Gast


stimmt, so könnte ich es auch machen. aber dann werden nur die ersten 10 Elemente verglichen. und ich will alle Elemente vergleichen...

ich leere jetzt meine liste:


C++:
for (int seq = 0; seq < 10; seq++)
    {

        if (seq > 0)
        {
            liste1neu.clear();                    
        }

        for (int i = seq; i < seq + 10; i++)
        {
            element = liste1.at(i);        
            liste1neu.push_back(element);
            cout << liste1neu.at(i) << endl; // "\n" << endl;
        }
        
        if (liste1neu == liste2)
        {
            cout << "Treffer! Es wurde eine gleiche Sequenz in den beiden Vektoren gefunden. " << endl;
            
            
        }

    }



aber ich bekomme immer einen fehler. und zwar
std::out_of_range at memory location 0x0099FAFC

was kann ich denn dagegen tun?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.01.2014, 20:34 Uhr
TOSHMAX



Das bedeutet, dass du versuchst auf ein nicht existentes Element zuzugreifen (d. h. der übergebene Index zu hoch ist). Nachdem du die neue Liste geleert hast, kannst du nicht denselben Index verwenden, wie für liste1. Da du 10 Elemente hinzufügst muss er am Anfang 0 und am Ende 9 sein. Die Anpassung dafür solltest du in der zweiten Schleife machen.

Wenn das Problem behoben ist kann es allerdings noch sein, dass du bis zu 10 Elemente über liste1 hinaus zählst. Damit das nicht passiert, sollte die erste Schleife begrenzt werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.01.2014, 04:47 Uhr
~Finnegan
Gast


Falls es dir nur um das ergebnis geht, und nicht der Weg dorthin das eigentliche Ziel ist (Übungsaufgabe), dann tut es auch ein simples


C++:
if (liste1 == liste2)
    std::cout << "Beide Listen haben die gleiche Länge und übereinstimmende Elemente" << std::endl;
else
    std::cout << "Die Listen sind ungleich" << std::endl;



std::vector hat einen überladenen operator==, der genau das macht, was du vermutlich erreichen willst.

Gruss,
Finnegan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: