Updating a Dictionary UVA - 12504 map+vector+string

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;
}

发布了51 篇原创文章 · 获赞 19 · 访问量 8295

猜你喜欢

转载自blog.csdn.net/WxqHUT/article/details/99121945
今日推荐