Wypisywanie obiektów klasy multimap

0
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

class Miasto {
public:
    string miasto, wojewodztwo;

    Miasto(string m, string w) : miasto(m), wojewodztwo(w) {}

    void wypisz() {
        cout << miasto << " " << wojewodztwo << " ";
    }
};

template<typename T>
void Printmap(multimap<T, T>& map)
{
    for (auto i = map.begin(); i != map.end(); i++)
    {
        (*i).wypisz();
    }
}

int main()
{
    multimap<Miasto, Miasto> map;
    string miasto, wojewod;
    ifstream plik;

    plik.open("miasta.txt", ios::in);

    if (plik.good() == false)
    {
        cout << "Plik nie istnieje" << endl;
        exit(0);
    }

    do
    {
        getline(plik, miasto, ' ');
        getline(plik, wojewod);
        map.insert(miasto, wojewod);

    } while (plik);

    plik.close();

    Printmap(map);


}

Dzień dobry. Bardzo prosze o pomocy. Nie wiem, w jaki sposób można wypisać obiekty klasy w multimapie. Wypisywanie musze być wykonane za pomocą metody wypisz, ktora jest w klasie.
Plik ma następującą postać :
Barcin kujawsko-pomorskie
Annopol lubelskie
Babimost lubuskie
Drzewica lodzkie
Alwernia malopolskie
Chorzele mazowieckie
Byczyna opolskie
Brzostek podkarpackie
Choroszcz podlaskie
Brusy pomorskie

1

Zdefiniuj własny operator < aby można było dodawać nowe typy obiektów do multimapy.
Przy dodawaniu użyj wyrażenia pair()

#include <iostream>
#include <map>

using namespace std;

struct City
{
    string city, province;
    bool operator<( const City& c ) const { return city<c.city; }
    friend ostream& operator<<( ostream& os , const City& m ) { os << m.city << " " << m.province << "\n"; return os; }
};

ostream& operator<<( ostream& os , const multimap<City,City>& data )
{
    for( const auto& cities : data ){ os << cities.first << cities.second; }
    return os;
}

int main()
{
    multimap<City,City> citiesmap;

    citiesmap.insert(pair(City{"AA","BB"},City{"CC","DD"}));
    citiesmap.insert(pair(City{"CC","BB"},City{"AA","DD"}));

    cout << citiesmap;
}
0

Dziękuje. Już trochę rozumiem. Ale jak mogę wypisać, żeby użyć metody wypisz()? Bo wypisuje mi bląd, że nie mogę wykorzystać tej metody.

1

Używaj wyrażeń first i second

      (*i).first.wypisz();
      (*i).second.wypisz();

oraz dodaj const do funkcji wypisz -> void wypisz() const {...}

0
map.insert(pair(miasto, wojewod));
map.insert(pair(Miasto(miasto), Miasto(wojewod)));

Mam błąd w każdym z tych sposobów, że jest brak argumentów dla szablona klasy "std:pair"

0

Klasa Miasto potrzebuje **dwóch **parametrów do poprawnej inicjalizacji tzn.

Miasto("Warszawa","mazowieckie");

Stąd poprawna jest forma

map.insert( pair( Miasto("Warszawa","mazowieckie") , Miasto("Kraków","małopolskie") ) );
0

Ale wszystko jedno wydaje mi też sam błąd : Błąd C2665 std :: pair <const Miasto, Miasto> :: pair: żadne z 2 przeciążeń nie może przekonwertować wszystkich typów argumentów

0
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

class Miasto {
public:
    string miasto, wojewodztwo;

    Miasto(string m, string w) : miasto(m), wojewodztwo(w) {}

    void wypisz() const {
        cout << miasto << " " << wojewodztwo << " ";
    }

    bool operator<(const Miasto& c) const { return miasto < c.miasto; }
    friend ostream& operator<<(ostream& os, const Miasto& m) { os << m.miasto << " " << m.wojewodztwo << "\n"; return os; }
};

ostream& operator<<(ostream& os, const multimap<Miasto, Miasto>& data)
{
    for (const auto& cities : data) { os << cities.first << cities.second; }
    return os;
}

int main()
{
    multimap<Miasto, Miasto> map;
    string miasto, wojewod;
    ifstream plik;

    plik.open("miasta.txt", ios::in);

    if (plik.good() == false)
    {
        cout << "Plik nie istnieje" << endl;
        exit(0);
    }

    do
    {
        getline(plik, miasto, ' ');
        getline(plik, wojewod);
        map.insert(pair(Miasto("Warszawa", "mazowieckie"), Miasto("Kraków", "małopolskie")));

    } while (plik);

    plik.close();

    for (auto i = map.begin(); i != map.end(); i++)
    {
        (*i).first.wypisz();
        (*i).second.wypisz();
    }

    
    

}
```>
To jest cały kod.
Ale wszystko jedno wydaje mi też sam błąd : Błąd C2665 std :: pair <const Miasto, Miasto> :: pair: żadne z 2 przeciążeń nie może przekonwertować wszystkich typów argumentów w linijce 48
1

Kod kompiluje się pod C++17. Jeżeli chcesz aby działa od C++11 w zwyż to użyj make_pair zamiast pair

map.insert(make_pair(Miasto(miasto, wojewod), Miasto(miasto, wojewod)));

Zobacz

0

Bardzo dziękuje za pomóc)

1 użytkowników online, w tym zalogowanych: 0, gości: 1