Hilfe bei Header Implementierungen.



  • Hallo liebes Forum,
    ich habe hier ein Programm bei dem ich nicht weiß was ich
    in die einzelnen Header Dateien codieren soll, damit das Programm
    Fehlerfrei läuft. String.h, map.h und vector.h sind die einzelnen Dateien.

    Programm:

    
    #include <iostream>
    #include <assert.h>
    #include "string.h"
    #include "map.h"
    #include "vector.h"
    
    typedef map<vector<unsigned>,string> ForwardMap;
    typedef map<string,vector<vector<unsigned>>> BackwardMap;
    
    void readKey(vector<unsigned>& rRes) {
      
    
    while (true) {
            int i;
            std::cin >> i;
            if (i < 0)
                return;
            else
                rRes.push_back(i);
        }
    }
    
    void insert(ForwardMap& rF,BackwardMap& rB) {
        vector<unsigned> key;
        readKey(key);
        string s;
        std::cin >> s;
        rF.insert(key,s);
        vector<vector<unsigned>>* res = rB.find(s);
        if (res == nullptr)
            rB.insert(s,{key});
        else
            res->push_back(key);
    }
    
    void search(const ForwardMap& crF,const BackwardMap& crB) {
        vector<unsigned> key;
        readKey(key);
        string* res = crF.find(key);
        if (res != nullptr) {
            vector<vector<unsigned>>* res2 = crB.find(*res);
            std::cout << *res << " " << res2->size() << std::endl;
            for(unsigned ui1 = 0;ui1 < res2->size();++ui1) {
                for(unsigned ui2 = 0;ui2 < (*res2)[ui1].size();++ui2)
                    std::cout << (*res2)[ui1][ui2] << " ";
                std::cout << std::endl;
            }
        }
    }
    
    int main() {
        ForwardMap m1;
        BackwardMap m2;
        while(true) {
            unsigned cmd = 0;
            std::cin >> cmd;
            switch (cmd) {
            case 1: insert(m1,m2);break;
            case 2: search(m1,m2);break;
            default: return 0;
            }
        }
        return 0;
    }


  • Wir auch nicht.

    Wir wissen noch nicht einmal, was das Programm machen soll.

    Wir wissen auch nicht, welche Fehler auftreten.



  • string.h, vector.h und map.h sind schon mal merkwürdig. Normalerweise sind das Klassen der STL und liegen in string, vector und map, also ohne die Endung .h.
    Falls du die Klassen der STL benutzt musst du den namespace den Typen explizit voranstellen, also std::string statt string. Gleiches gilt für map und vector.
    Ansonsten:
    Das, was manni sagt.



  • Du möchtest wohl eher die Header der Standard-C++ Library einbinden:

    #include <string>
    #include <map>
    #include <vector>
    

    Da die enthaltenen Klassen dadrin alle im Namensbereich std liegen, mußt du eines der folgenden Dinge umsetzen:

    • explizit vor jede Klasse std:: schreiben (so wie du es ja bei std::cinund std::cout auch schon gemacht hast ;- )
    • using namespace std;
    • explizit für jede einzelne zu benutzende Klasse using ... einmalig schreiben, z.B. using std::vector;


  • @DocShoe sagte in Hilfe bei Header Implementierungen.:

    string.h, vector.h und map.h sind schon mal merkwürdig. Normalerweise sind das Klassen der STL und liegen in string, vector und map, also ohne die Endung .h.

    Die andere Form des Includes und die Endung suggerieren aber, dass das möglicherweise eigene Header sind, und früher gab es auch mal beim Compiler string.h, vector.h … aber das ist alles STL lange vor dem ersten ISO C++ Release.



  • @john-0

    Ja, früher hieß Twix Raider. Der erste Standard ist von 1998, glaubst du OP benutzt einen Compiler, der so alt ist? Ja, vielleicht, oder vielleicht hat der TE auch zufällig Klassen programmiert, die sich in Bezug auf Namen und Syntax nicht von denen der STL unterscheiden. Welche der beiden Optionen ist wahrscheinlicher, die, die ich gerade genannt habe, oder die, dass die #include Namen falsch sind?



  • @DocShoe sagte in Hilfe bei Header Implementierungen.:

    @john-0

    Ja, früher hieß Twix Raider. Der erste Standard ist von 1998, glaubst du OP benutzt einen Compiler, der so alt ist?

    Mich würde es nicht wundern, wenn es mal wieder so eine uralt Übung wäre.



  • @john-0 sagte in Hilfe bei Header Implementierungen.:

    Mich würde es nicht wundern, wenn es mal wieder so eine uralt Übung wäre.

    This!

    @Rudi231: ist das eine Übungsaufgabe von <ganz alt>?

    Ich würde

    typedef map<vector<unsigned>,string> ForwardMap;
    

    so schreiben:

    using ForwardMap = std::map<std::vector<unsigned>, std::string>;
    

    Also mit using statt typedef. Das geht wesentlich einfacher in meinen Kopf.

    Aber abgesehen von der Schreibweise: eine map mit einem vector<> als Key? Gehen tut das, aber das erscheint mir doch hoch fragwürdig!


Anmelden zum Antworten