STL训练题。检查两个字典的变动,看起来很复杂,需要耐心分析。从string中获取map数据,再对两个map进行分析,使用vector承接改动。
#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
ostream& operator<<(ostream& os, const vector<string>& s)
{
bool first = true;
for (int i = 0; i < s.size(); ++i)
{
if (first) first = false;
else os << ",";
os << s[i];
}
return os;
}
typedef map<string, string> dict;
void parse(dict& m , const string& s)
{
m.clear();
string key, value;
bool k = true;
for (int i = 0; i < s.size(); ++i)
{
char c = s[i];
if (c == '{') continue;
else if (c == ':'){k = false;}
else if (c == ',' || c == '}')
{
if (key.empty()) continue;
m[key] = value;
key.clear();
value.clear();
k = true;
}
else
{
if (k) key.push_back(c);
else value.push_back(c);
}
}
}
int main()
{
dict m1, m2;
int n;
cin >> n;
string l1, l2;
vector<string> added, deled, changed;
while (n--)
{
cin >> l1 >> l2;
added.clear();
deled.clear();
changed.clear();
parse(m1, l1);
parse(m2, l2);
for (dict::iterator it = m1.begin(); it != m1.end(); ++it)
{
const string &k = it->first;
if (m2.count(k))
{
if (m2[k] != it->second) changed.push_back(k);
}
else deled.push_back(k);
}
for (dict::iterator it = m2.begin(); it != m2.end(); ++it)
{
const string &k = it->first;
if (!m1.count(k)) added.push_back(k);
}
if (added.empty() && deled.empty() && changed.empty())
{
cout << "No changes\n" << endl;
continue;
}
sort(added.begin(), added.end());
sort(deled.begin(), deled.end());
sort(changed.begin(), changed.end());
if (!added.empty()) cout << "+" << added << endl;
if (!deled.empty()) cout << "-" << deled << endl;
if (!changed.empty()) cout << "*" << changed << endl;
cout << endl;
}
return 0;
}