Печать всех элементов мультикарты, которые являются парой из 2 разных объектов в C ++? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 2 класса A и B. Я создаю объекты, которые затем помещаются в мультикарту.Я хочу напечатать все ключи с соответствующими значениями.Однако моя попытка сделать это не была настолько успешной, как я мог создать итератор.Я хотел бы спросить, как я могу использовать метод equal_range() для достижения этой цели.Заранее спасибо!

#include "pch.h"
#include <iostream>
#include <map>
using namespace std;
class A {
    int key;
public:
    A(int k) {
        key = k;
    }
    A(A ob) {
        key = ob.key;
    }
    int getKey() {
        return key;
    }
};
class B {
    string value;
public:
    B(string v) {
        value = v;
    }
};
multimap <A, B> mp;
int main() {
    mp = {
        make_pair(A(1),B("Crime and punishment")),
        make_pair(A(1),B("The Idiot")),
        make_pair(A(1),B("Brothers' Karamazov")),
        make_pair(A(2),B("Andreshko")),
        make_pair(A(2),B("The Gerak family")),
        make_pair(A(3),B("The name of the rose")),
        make_pair(A(3),B("Baudolino"))
    };
    for (auto ml = mp.begin(); ml != mp.end();ml++) {
        multimap<pair<int, string>, pair<int, string>>::iterator it;

    }



}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Некоторые вещи, которые вам нужны:

  • Методы получения для класса B.
  • Оператор меньше чем для вашего ключевого класса A.
  • Конструктор копирования для класса A.

В приведенном ниже коде, если удаление кода не требуется (но было бы неплохо сохранить в живом коде), чтобы показать, что действительно используется.

#include <iostream>
#include <map>
#include <string>

using namespace std;

class A {
    int key;
public:
    A(int k) : key(k){}
    A(A const& ob) : key(ob.key) {}
    A& operator=(A const& ob) = delete;
    int getKey() const { return key; }
    friend bool operator<(A const&left, A const&right) { return  left.key < right.key; }
};

class B {
    string value;
public:
    B(string const& v) : value(v) {}
    B(B const&) = default;
    B& operator=(B const&) = delete;
    string const& getValue() const { return value; }
};

multimap<A, B> mp;

int main() {
    mp = {
            make_pair(A(3), B("Baudolino")),
            make_pair(A(1), B("Crime and punishment")),
            make_pair(A(1), B("Brothers' Karamazov")),
            make_pair(A(2), B("Andreshko")),
            make_pair(A(1), B("The Idiot")),
            make_pair(A(2), B("The Gerak family")),
            make_pair(A(3), B("The name of the rose"))
    };
    for (auto const & item : mp) {
        cout << "key:" << item.first.getKey() << " value:\"" << item.second.getValue() << "\"\n";
    }
}
0 голосов
/ 12 ноября 2018

У вас уже есть цикл, но давайте вместо этого будем использовать дальний цикл C ++ 11.

Вам просто не хватает средства доступа к значению, поэтому давайте предположим, что оно у вас есть (getValue) ипросто получите доступ к итератору:

for (const auto& pair : mp) {
    std::cout << ml.first.getKey() << "\t" << ml.second.getValue() << std::endl;

}

Также измените это:

A(A ob)

На

A(const A& ob)

Это даст реальное назначение копирования.Но конструктор копирования по умолчанию тоже подойдет, так что не упоминайте его вообще, конструктор по умолчанию уже подойдет вам.

...