TransWikia.com

Поиск и сложение элементов в map и vector

Stack Overflow на русском Asked on December 23, 2021

В коде нужно, чтобы цена на один и тот же товар, для одного и того же покупателя складывалась.

Например, при вводимых данных такого вида:

Ivanov paper 10
Petrov pens 5
Ivanov marker 3
Ivanov paper 7
Petrov envelope 20
Ivanov envelope 5

Вывод должен быть таким:

Ivanov:
envelope 5
marker 3
paper 17
Petrov:
envelope 20
pens 5
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
struct item {
    string name;
    int price;
};
 
int main (void) {
    map <string, vector <item>> s;
    string key, name;   int price;
 
    cout << "input:" << endl;
    while (cin >> key >> name >> price)
        s[key].push_back({name, price});
 
    cout << endl;
    for (auto n : s)
        for (auto i : n.second)
            cout << n.first << " " << i.name << ": " << i.price << endl;
 
    return 0;
}

2 Answers

Предложу свою версию кода с использованием map<string, map<string, int>>. Условимся, что конец ввода на три нуля, а то эти споры про ввод никогда не утихнут.

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

using namespace std;
 
int main () 
{
    map <string, map<string, int>> s;
    string key, name;   
    int price;
 
    cout << "input:" << endl;
    while (cin >> key >> name >> price)
    {
        if (key == "0" && name == "0" && price == 0)
            break;
        s[key][name] += price;
    }
 
    cout << endl;
    for (pair<string, map<string, int>> pers : s)
    {
        cout << pers.first << ":n";
        for (pair<string, int> item : pers.second)
            cout << item.first << " " << item.second << endl;
    }
 
    return 0;
}

Answered by EzikBro on December 23, 2021

Для того, чтобы сложить цены введенных товаров, их надо искать в векторе, сравнивая наименования (name) в структурах, а если ничего не найдено, то добавлять новую позицию (структуру item) в вектор:

#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
struct item {
    string name;
    int price;
};
 
int main (void) {
    map <string, vector <item>> s;
    string key, name;   int price;
 
    cout << "input:" << endl;
    while (cin >> key ) {
        // Разбил ваш cin, иначе не ясно как вы выскакиваете из цикла ввода позиций
        // Если введен q, то выходим из ввода позиций 
        if ( key == "q" ) 
            break;

        cin >> name >> price;

        // флаг найденной позиции в векторе
        bool flag = false;
        for( int i = 0; i < s[key].size(); i++)
            if ( s[key][i].name == name ) {
                // Нашли позицию - складываем цену
                s[key][i].price += price;
                flag = true;
                break;
            }            
        // Если позиция не была найдена, то добавляем ее в вектор
        if ( !flag )            
            s[key].push_back({name, price});
    }
 
    cout << endl;
    for (auto n : s)
        for (auto i : n.second)
            cout << n.first << " " << i.name << ": " << i.price << endl;
 
    return 0;
}

Answered by Alexander Chernin on December 23, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP