map перезаписывает элемент а не добавляет

113
19 февраля 2021, 00:10

Метод map перезаписывает элемент а не добавляет новый, пробовал и методом emplace и pair, в чем ошибка подскажите?

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <sstream>
using namespace std;

class test1
{
private:
    std::string name;
    int age;
public:
    test1() {};
    test1(std::string name, int age)
    {
        this->name = name;
        this->age = age;
    }
    bool operator < (const test1 & a) const
    {
        return (this->name < a.name) && (this->age < a.age);
    }
    std::string GetName() const
    {
        return this->name;
    }
    int GetAge() const
    {
        return this->age;
    }
    friend ostream & operator << (ostream & os, const test1 & a)
    {
        os << "name: " << a.GetName() << " " << "age : " << a.GetAge();
        return os;
    }
};
class test2
{
private:
    std::string bag;
    std::string color;
public:
    test2() {};
    test2(std::string bagName, std::string color)
    {
        this->bag = bagName;
        this->color = color;
    }
    std::string GetBag() const
    {
        return this->bag;
    }
    std::string Color() const
    {
        return this->color;
    }
    friend ostream & operator << (ostream & os, const test2 & a)
    {
        os << "name: " << a.GetBag() << " " << "age : " << a.Color();
        return os;
    }
};
int main()
{
    std::map<test1, test2> myMap;
    test1 user1{ "John", 20 };
    test2 inventory{ "Daykine", "red" };
    myMap.insert(pair<test1, test2>(user1, inventory));
    test1 user2{ "Victor", 20 };
    test2 inventory2{ "Daykine", "blue" };
    myMap.emplace(user2, inventory2);
    test1 user3{ "Victor", 20 };
    test2 inventory3{ "Daykine", "blue" };
    myMap.emplace(user3, inventory3);
    for (auto & item : myMap)
    {
        cout << item.first;
        cout << item.second;
    }
    return 0;
}
Answer 1
bool operator < (const test1 & a) const
{
    if (this->name < a.name){
        return true;
    }else if (this->name == a.name){
        if (this->age < a.age){
            return true;
        }
    }
    return false;
}

И оператор сравнения у вас неправильно написан как по мне. С таким оператором уже второй элемент появится, а третий нет (потому-что не std::multimap)

Answer 2

Возможно, вам нужен другой контейнер.

Контейнер std::map хранит уникальные ключи. Если вы добавляете новый элемент с тем же ключом, вы перезапишете старый, который уже имеется в контейнере.

Если вам нужно хранить много элементов с повторяющимися ключами, используйте std::multimap .

READ ALSO
Как работает istream&amp; параметр?

Как работает istream& параметр?

Помогите разобраться нубу с тем, как работает istream&, конкретно интересует следующая конструкция:

115
Как присвоить wchar[256] переменную?

Как присвоить wchar[256] переменную?

Есть текстовый файл в котором хранится ссылка к примеру (https://rustackoverflow

117
Программа работает медленне, чем должна

Программа работает медленне, чем должна

Есть код простой небольшой демки на C++В ней реализовывается механика "ходить, ставить блоки, убирать блоки"

116