C/C++

Программирование C++. map std::

У меня сейчас такой код, но он для 2 значений предмет-цена (цена складывается) и нужно как-то в начале перед предметом добавить имя, чтобы было Имя-предмет-цена (цена также складывается. как я понял вид map будет
map<string, map>

#include
#include
#include

using namespace std;
int main()
{
string s;
int k;
map d;
while (cin >> s >> k)
{
if (d.count(s) == 1)
{
d[s] += k;
}
else
{
d[s] = k;
}
}
for (auto i = d.begin();i != d.end();i++)
{
cout << (*i).first << " " << (*i).second << endl;
}
return 0;
}
// для файла базы данных db.txt
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
#include <fstream>
#include <sstream>
#include <map>
using namespace std;
class Record {
public:
using rec_t = tuple<string, string, size_t>;
Record()
: name_("-"), product_("-"), count_(0U) {}
Record(const string& name, const string& product, const size_t count)
: name_(name), product_(product), count_(count) {}
Record(const rec_t& rec)
: name_(get<0>(rec)), product_(get<1>(rec)), count_(get<2>(rec)) {}
void name(const string& value) { name_ = value; }
void product(const string& value) { product_ = value; }
void count(const size_t value) { count_ = value; }
rec_t record()const { return { name_, product_, count_ }; }
private:
string name_;
string product_;
size_t count_;
};
class Table {
public:
Table() = default;
bool load(const string& path) {
ifstream db(path);
if (db.is_open()) {
string line;
while (getline(db, line)) {
istringstream iss(line);
string name;
string product;
size_t count;
try {
iss >> name >> product >> count;
box_.emplace_back(Record{ name, product, count });
} catch (...) {
box_.clear();
db.close();
return false;
}
}
db.close();
} else return false;
return true;
}
void show()const {
map<string, map<string, size_t>> orders;
for (const auto& item : box_) {
auto [name, product, count] = item.record();
orders[name].insert({ product, count });
}
for (auto& [name, selection] : orders) {
cout << name << ':';
for (auto& [product, count] : selection) {
cout << "\n - " << product << ", " << count;
}
cout.put('\n');
}
cout.put('\n');
}
private:
vector<Record> box_;
};
int main() {
system("chcp 1251 > nul");
Table table;
if (table.load("db.txt")) table.show();
else puts("Ошибка: не удалось получить доступ к данным");
system("pause > nul");
}
СГ
Сергей Галактионов
73 705
Лучший ответ
я не понял задачу
в коде только два поля: ключ (какая-то строка) и значение (какое-то число)
никакого имени здесь я не вижу, и что с ним предполагается делать, я тоже не понимаю

по коду два замечания:
- if (d.count(s) == 1) ...else ...- не нужно, можно сразу ковырять d[s], т. к. при отсутствии оно автоматически инициализируется нулём
- (*i).first - зачем, если i->first ?
NB
Nik Boy
51 164
Иван Иванов Нужно, чтобы цена складывалась по типу:
ВВОД

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
map<pair< string, string >,int> выглядит куда более прилично
Николай Мякишев #include < iostream >
#include < vector >
#include < set >
#include < stack >
#include < map >
#include < algorithm >

using namespace std;

typedef long long ll;

signed main() {
map< string,map< string,ll > > m;
ll n;
cin >> n;
while(n--){
string name,obj;
ll cost;
cin >> name >> obj >> cost;
m[name][obj] += cost;
}
for(auto &i: m){
cout << i.first << ": \n";
for(auto &j: m[i.first])
cout << j.first << ' ' << j.second << "\n";
}
}