2017-01-29 2 views
-4

Vor kurzem wechselte ich von Python zu C++ aufgrund der Universität Anforderung und ich habe es schwer zu verstehen, die Synthax für C++.Tupel von int in C++ erstellen

Ich habe ein Problem mit meiner Aufgabe, wo ich eine Reihe von ganzen Zahlen aufnehmen und ihnen ein Tupel zurückgeben muss. Diese mir erfordert die ganzen Zahlen als Tupel an verschiedenen Punkten zu speichern

Der Code ist wie folgt:

#include <iostream> 
    #include <string> 
    #include <stdio.h> 
    #include <tuple> 
    #include <functional> 

    using namespace std; 

    int main() 
    { 
     int times; 
     cin >> times; 
     //scanf("%d", &times); 

     int x_point; 
     int y_point; 
     int k; 
     int iA[times]; 
     for (k = 1; k <= times; k++) 
      cin >> x_point >> y_point; 
      iA[k] = make_tuple(x_point, y_point); 

    } 

erhalte ich die Fehlermeldung „Fehler: kann nicht‚std :: tuple‘auf‚int‘in Zuordnung konvertieren "Ich verstehe, wo der Fehler auftritt, aber ich weiß nicht, welchen Datentyp ich als iA definieren soll.

 tuple iA[times] 

Funktioniert nicht. Kann ich das überhaupt machen? Danke

+1

Sie können auf die Dokumentation in Bezug auf ['make_tuple (x_point, y_point);'] (http://en.cppreference.com/w/cpp/utility/tuple/make_tuple) verweisen. Verwenden Sie auch Klammern, um den 'for()' -Schleifenkörper '{}' einzuschließen, Einrückung ist nicht genug, um die Anweisungen anders als in Python zu gruppieren. –

+0

"Aber ich weiß nicht, welcher Datentyp' iA' zu definieren ist als "Wie ein [' std :: tuple '] (http://en.cppreference.com/w/cpp/utility/tuple) natürlich was sonst? Bitte lesen Sie die Dokumentation. Der Rückgabetyp von 'std :: make_tuple' ist der Typ, den Sie als' iA' verwenden möchten. – Rakete1111

+0

Als 'std :: tuple ' würde man denken ... – StoryTeller

Antwort

1

Die make_tuple gibt ein temporäres Objekt von tuple zu einem object of tuple nicht zu int[ index ] zurück. Bist du deshalb complier sagen:

Fehler: kann nicht 'std :: tuple' auf 'int' in Zuordnung konvertieren

Sie so etwas wie dieses benötigen (zum Beispiel)
std::tuple< int, int, float > my_tuple = std::make_tuple< 1, 1, 1.1 >();


In C++ zuerst die std::pair wird erstellt und die std::tuple ist eine komplexe und erweiterte Verwendung wenn std::pair.
In der Tat std :: Paar ist einfach zu bedienen und zu verstehen, aber std::tuple nicht, weil es mehr Vorlage Programmierung als std::pair hat.
Wie ich sehen kann sind Sie std::tuple in Python mit ebenfalls in C++ verwirrend.
In C++ erklären Sie haben den Typ ausdrücklich, außer nach C++ 11, die Sie auto verwenden können:

auto my_tuple = std::make_tuple< 1, "hello" >();

Auch mit std::pair, drucken Sie die Ausgänge in einfach:
std::cout << pair.first << " " << pair.second << std::endl;

aber mit std::tuple sollten Sie verwenden:
std::cout << std::get<0>(my_tuple) << std::endl; für den ersten Index.
Also einige Anfänger, die keine Erfahrung mit Vorlage hat, hätte es schwer, es geschafft.


Ich bin Anfänger wie Sie, so empfehle ich Ihnen zuerst std::pair verwenden dann gehen Sie vor und verwenden std::tuple, weil es ein wenig komplex für Anfänger in C++ ist.


Kurz meinen githup sehen, dass eine Menge Beispiel hat 1000_examples_with_c++

+0

Hallo, danke für den Tipp! Doing-Paar funktioniert nicht als Tupel sind die Voraussetzung für meine Aufgabe. –

+0

Bitte warten Sie, bis ich meine Antwort auf klare Weise bearbeite :) –

+0

Wenn ich my_tuple = std :: make_tuple < 1, 1, 1.1 >(); Es besagt, dass my_tuple nicht definiert ist. Versucht mit std :: tuple t (x_point, y_point) zu, aber ich bekomme Variable 'std :: tuple t' hat Initialisierer aber unvollständiger Typ –

2
#include<iostream> 
#include<tuple> 
#include<vector> 
using namespace std; 
int main() 
{ 
    int times; 
    cin >> times; 

    int x_point; 
    int y_point; 
    int k; 
    vector<tuple <int,int>> iA; 
    for (k = 0; k <times; k++) { 
     cin >> x_point >> y_point; 
     iA.push_back(make_tuple(x_point, y_point)); 
    } 
    return 0; 
} 

Dies scheint für mich zu arbeiten. Dies erfordert auch Bibliotheksunterstützung für den ISO C++ 2011-Standard. Dies sollte mit den C++ 11 Compileroptionen funktionieren.

+0

* "Tuple-Unterstützung ist derzeit experimental "* - Nur wenn du in der Vergangenheit lebst. Oder was meinst du sonst mit "aktuell"? –

+0

Tupelunterstützung ist nicht experimentell. Schreib einfach das C++ 11. Seien Sie spezifisch bei Compiler-Flags. – Inline

+0

Die Nachricht wurde wie von @Inline vorgeschlagen bearbeitet – px42

1

int iA[times]; ist nicht Standard C++, wenn times keine Kompilierzeitkonstante ist. Es ist eine GCC-Erweiterung (Arrays variabler Länge oder VLA genannt), die es in zukünftige Versionen von C++ schaffen kann oder auch nicht. Sie dürfen nicht verwenden, wenn Sie möchten, dass Ihr Code portabel ist.

Der korrekte, einfache und normale Weg ist die Verwendung std::vector. Der Elementtyp sollte std::tuple<int, int> sein, weil Sie Paare von ganzen Zahlen speichern möchten. Und der Variablenname iA ist bedeutungslos, also warum nicht einfach integers anrufen? Oder vielleicht können Sie sich einen aussagekräftigeren Namen ausdenken.

std::vector<std::tuple<int, int>> integers; 

Es besteht keine Notwendigkeit, den Vektor zu initialisieren zunächst times Elemente zu halten.

integers.push_back(std::make_tuple(x_point, y_point)); 

Ihr aktueller Code nicht auch, weil es Arrays behandelt, als ob sie einen beruhten: Sie können ihre push_back Member-Funktion hinzufügen Elemente dynamisch verwenden. Aber sie sind nullbasiert (d. H. Ihre Indizes gehen von zu n-1).

Und Sie vermissen die {/} geschweiften Klammern um den Block Ihrer for Schleife, was bedeutet, dass nur die cin >> x_point >> y_point; Linie geschlungen ist.

Was noch? Verwenden Sie nicht using namespace std, deklarieren Sie keine lokalen Variablen, bevor Sie sie verwenden, machen Sie Ihre Variablennamen aussagekräftiger und verwenden Sie nicht die Funktionen in <stdio.h> (wie scanf).