Условие
Вы когда-нибудь слышали про ассоциативный массив? Это такой массив, в котором вместо индексов можно использовать произвольные значения, а не только целые числа. Например, можно в качестве индексов использовать строковые переменные. Индексы в таком массиве обычно называются ключами.
В этой задаче вы должны будете создать класс-ассоциативный массив, в котором в качестве ключей используются строки, а в качестве значений — целые числа. Пример работы с таким массивом a выглядит так:
a["St.Petersburg"] = 5281579;
a["Yekaterinburg"] = 1455904;
a["Novosibirsk"] = 1602915;
a["Kazan"] = 1231878;
a["Moscow"] = 12380664;
a["Chelyabinsk"] = 1198858;
Для создания массива достаточно внутри хранить два динамических массива: массив ключей и массив соответствующих им значений.
Примерный вид класса должен выглядеть так:
class AssocArray {
int len;
int* data; // Дин. массив значений
char** keys; // Дин. массив. ключей
public:
AssocArray(); // Создаёт пустой массив
~AssocArray();
// Создаёт элемент с индексом key, если
// его нет и присваивает в него 0, и
// возвращает его.
int &operator[] (const char* key);
};
Создайте пустой объект-ассоциативный массив, и примените к нему те операции, которые вводятся с клавиатуры. Формат и виды операций описаны в формате входных данных.
Формат входных данных
В первой строке вводится целое число K (1≤K≤1000) — количество команд.
В следующих K строках вводятся команды. Каждая команда бывает одного из трёх видов:
1. «SET w x» (данная команда сохраняет в ассоциативном массиве значение x в ключе w); 2. «INC w x» (данная команда увеличивает в ассоциативном массиве значение в ключе w на x); 3. «GET w» (данная команда выводит на экран значение в ключе w).
Гарантируется, что ключи — слова длины не более 20, состоящие из латинских букв, цифр и символов нижних подчёркиваний, а числа x во всех командах не превосходят 10^6 по модулю.
Формат выходных данных
Выведите на экран ответ на каждый запрос GET.
------------------------------------------------------------------------------------------------------------------------------
Примеры:
входные данныевыходные данные
7 | 12380665
SET Yekaterinburg 1455904
SET Novosibirsk 1602915
SET Kazan 1231878
SET Moscow 12380664
SET Chelyabinsk 1198858
INC Moscow 1
GET Moscow
C/C++
Решите задачу на C++
#include <algorithm>
#include <iostream>
#include <list>
#include <string>
using namespace std;
class Element {
public:
Element(const string& key, const int value) : key_(key), value_(value) {}
const string& key()const {
return key_;
}
int& value() {
return value_;
}
void value(const int& val) {
value_ = val;
}
void value(int&& val) {
value_ = val;
}
private:
string key_;
int value_;
friend bool operator<(const Element& a, const Element& b) {
return a.key_ < b.key_ || (a.key_ == b.key_ && a.value_ < b.value_);
}
friend bool operator==(const Element& a, const Element& b) {
return a.key_ == b.key_ && a.value_ == b.value_;
}
};
class Box {
public:
bool contains(const string& k)const {
auto fn = [&k](const Element& x) { return k == x.key(); };
return find_if(box_.begin(), box_.end(), fn) != box_.end();
}
void emplace(Element&& e) {
if (box_.empty()) box_.emplace_back(e);
else {
auto fn = [&e](const Element& x) { return e < x; };
auto itr = find_if(box_.begin(), box_.end(), fn);
if (contains(e.key())) {
box_.remove(e);
auto itr = find_if(box_.begin(), box_.end(), fn);
box_.emplace(itr, e);
} else if (itr != box_.end()) {
box_.emplace(itr, e);
} else {
box_.emplace_back(e);
}
}
}
void insert(Element& e) {
if (box_.empty()) box_.insert(box_.begin(), e);
else {
auto fn = [&e](const Element& x) { return e < x; };
auto itr = find_if(box_.begin(), box_.end(), fn);
if (contains(e.key())) {
box_.remove(e);
auto itr = find_if(box_.begin(), box_.end(), fn);
box_.insert(itr, e);
} else if (itr != box_.end()) {
box_.insert(itr, e);
} else {
box_.insert(box_.begin(), e);
}
}
}
int& operator[](const string& k) {
auto fn = [&k](const Element& x) { return x.key() == k; };
auto itr = find_if(box_.begin(), box_.end(), fn);
return itr->value();
}
private:
list<Element> box_;
};
void flush() {
cin.ignore(cin.rdbuf()->in_avail());
}
void test() {
Box box;
int n;
cin >> n;
flush();
string command;
string key;
for (int i = 0; i < n; ++i) {
cin >> command;
if (command == "SET") {
int value;
cin >> key >> value;
flush();
box.emplace({ key, value });
} else if (command == "INC") {
int inc;
cin >> key >> inc;
flush();
if (box.contains(key)) box[key] += inc;
} else if (command == "GET") {
cin >> key;
if (box.contains(key)) cout << box[key] << '\n';
}
}
}
int main() {
test();
}
P.S. Здесь не динамический массив, а список из STL, и по умолчанию ассоциативный массив сортируется по возрастанию, но дело своё он делает хорошо) Может и прокатит))
#include <iostream>
#include <list>
#include <string>
using namespace std;
class Element {
public:
Element(const string& key, const int value) : key_(key), value_(value) {}
const string& key()const {
return key_;
}
int& value() {
return value_;
}
void value(const int& val) {
value_ = val;
}
void value(int&& val) {
value_ = val;
}
private:
string key_;
int value_;
friend bool operator<(const Element& a, const Element& b) {
return a.key_ < b.key_ || (a.key_ == b.key_ && a.value_ < b.value_);
}
friend bool operator==(const Element& a, const Element& b) {
return a.key_ == b.key_ && a.value_ == b.value_;
}
};
class Box {
public:
bool contains(const string& k)const {
auto fn = [&k](const Element& x) { return k == x.key(); };
return find_if(box_.begin(), box_.end(), fn) != box_.end();
}
void emplace(Element&& e) {
if (box_.empty()) box_.emplace_back(e);
else {
auto fn = [&e](const Element& x) { return e < x; };
auto itr = find_if(box_.begin(), box_.end(), fn);
if (contains(e.key())) {
box_.remove(e);
auto itr = find_if(box_.begin(), box_.end(), fn);
box_.emplace(itr, e);
} else if (itr != box_.end()) {
box_.emplace(itr, e);
} else {
box_.emplace_back(e);
}
}
}
void insert(Element& e) {
if (box_.empty()) box_.insert(box_.begin(), e);
else {
auto fn = [&e](const Element& x) { return e < x; };
auto itr = find_if(box_.begin(), box_.end(), fn);
if (contains(e.key())) {
box_.remove(e);
auto itr = find_if(box_.begin(), box_.end(), fn);
box_.insert(itr, e);
} else if (itr != box_.end()) {
box_.insert(itr, e);
} else {
box_.insert(box_.begin(), e);
}
}
}
int& operator[](const string& k) {
auto fn = [&k](const Element& x) { return x.key() == k; };
auto itr = find_if(box_.begin(), box_.end(), fn);
return itr->value();
}
private:
list<Element> box_;
};
void flush() {
cin.ignore(cin.rdbuf()->in_avail());
}
void test() {
Box box;
int n;
cin >> n;
flush();
string command;
string key;
for (int i = 0; i < n; ++i) {
cin >> command;
if (command == "SET") {
int value;
cin >> key >> value;
flush();
box.emplace({ key, value });
} else if (command == "INC") {
int inc;
cin >> key >> inc;
flush();
if (box.contains(key)) box[key] += inc;
} else if (command == "GET") {
cin >> key;
if (box.contains(key)) cout << box[key] << '\n';
}
}
}
int main() {
test();
}
P.S. Здесь не динамический массив, а список из STL, и по умолчанию ассоциативный массив сортируется по возрастанию, но дело своё он делает хорошо) Может и прокатит))
Похожие вопросы
- Помогите решить задачу по C++!
- Нужно срочно решить задачу на C++
- Помогите решить задачу на C++
- Помогите решить задачу на C++.
- Помогите решить задачу на c++
- Помогите пожалуйста решить задачу на C ИЛИ C#
- Помогите решить задачу на C++
- Решить задачу по c++
- Помогите решить задачу на C++
- Помогите решить задачу на C++